Là một cách tiếp cận khác với hệ thống plugin, Bạn có thể kiểm tra dự án Extend Me .
Ví dụ: hãy định nghĩa lớp đơn giản và phần mở rộng của nó
# Define base class for extensions (mount point)
class MyCoolClass(Extensible):
my_attr_1 = 25
def my_method1(self, arg1):
print('Hello, %s' % arg1)
# Define extension, which implements some aditional logic
# or modifies existing logic of base class (MyCoolClass)
# Also any extension class maby be placed in any module You like,
# It just needs to be imported at start of app
class MyCoolClassExtension1(MyCoolClass):
def my_method1(self, arg1):
super(MyCoolClassExtension1, self).my_method1(arg1.upper())
def my_method2(self, arg1):
print("Good by, %s" % arg1)
Và cố gắng sử dụng nó:
>>> my_cool_obj = MyCoolClass()
>>> print(my_cool_obj.my_attr_1)
25
>>> my_cool_obj.my_method1('World')
Hello, WORLD
>>> my_cool_obj.my_method2('World')
Good by, World
Và hiển thị những gì ẩn đằng sau hiện trường:
>>> my_cool_obj.__class__.__bases__
[MyCoolClassExtension1, MyCoolClass]
thư viện extend_me điều khiển quá trình tạo lớp thông qua siêu dữ liệu, ví dụ như ở trên, khi tạo phiên bản mới của MyCoolClass
chúng ta có thể hiện của lớp mới là lớp con của cả hai MyCoolClassExtension
và MyCoolClass
có chức năng của cả hai, nhờ vào tính kế thừa của Python
Để kiểm soát tốt hơn việc tạo lớp, có một số siêu dữ liệu được định nghĩa trong lib này:
ExtensibleType
- cho phép mở rộng đơn giản bằng cách phân lớp
ExtensibleByHashType
- tương tự như ExtensibleType, nhưng có khả năng xây dựng các phiên bản chuyên biệt của lớp, cho phép mở rộng toàn cầu lớp cơ sở và mở rộng các phiên bản chuyên biệt của lớp
Lib này được sử dụng trong OpenERP Proxy Project và dường như hoạt động đủ tốt!
Để biết ví dụ thực tế về việc sử dụng, hãy xem phần mở rộng 'Field_datetime' của OpenERP Proxy :
from ..orm.record import Record
import datetime
class RecordDateTime(Record):
""" Provides auto conversion of datetime fields from
string got from server to comparable datetime objects
"""
def _get_field(self, ftype, name):
res = super(RecordDateTime, self)._get_field(ftype, name)
if res and ftype == 'date':
return datetime.datetime.strptime(res, '%Y-%m-%d').date()
elif res and ftype == 'datetime':
return datetime.datetime.strptime(res, '%Y-%m-%d %H:%M:%S')
return res
Record
đây là đối tượng mở rộng. RecordDateTime
là phần mở rộng.
Để bật tiện ích mở rộng, chỉ cần nhập mô-đun có chứa lớp mở rộng và (trong trường hợp ở trên) tất cả Record
các đối tượng được tạo sau nó sẽ có lớp mở rộng trong các lớp cơ sở, do đó có tất cả chức năng của nó.
Ưu điểm chính của thư viện này là, mã vận hành các đối tượng có thể mở rộng, không cần biết về tiện ích mở rộng và tiện ích mở rộng có thể thay đổi mọi thứ trong các đối tượng mở rộng.