Eklenti sistemine bir başka yaklaşım olarak, Extend Me projesini kontrol edebilirsiniz .
Örneğin, basit sınıfı ve uzantısını tanımlayalım
# 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)
Ve kullanmaya çalışı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
Ve sahnenin arkasında neyin gizli olduğunu göster:
>>> my_cool_obj.__class__.__bases__
[MyCoolClassExtension1, MyCoolClass]
expand_me kütüphanesi, sınıf oluşturma sürecini metasınıflar aracılığıyla manipüle eder, bu nedenle yukarıdaki örnekte, Python'un çoklu kalıtım sayesinde her ikisinin MyCoolClass
de alt sınıfı olan MyCoolClassExtension
ve her ikisinin de MyCoolClass
işlevselliğine sahip yeni sınıfın örneğini oluştururken
Sınıf yaratımı üzerinde daha iyi kontrol için bu lib'de tanımlanmış az sayıda metasınıf vardır:
ExtensibleType
- alt sınıflandırma ile basit genişletilebilirlik sağlar
ExtensibleByHashType
- ExtensibleType'a benzer, ancak sınıfın özel sürümlerini oluşturma becerisine sahip olma, temel sınıfın küresel uzantısına ve sınıfın özel sürümlerinin genişletilmesine izin verme
Bu lib OpenERP Proxy Project'te kullanılıyor ve yeterince iyi çalışıyor gibi görünüyor!
Gerçek kullanım örneği için OpenERP Proxy 'field_datetime' uzantısına bakın :
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
işte nesneyi bulabilir. RecordDateTime
uzantısıdır.
Uzantıyı etkinleştirmek için, sadece uzantı sınıfını içeren modülü içe aktarın ve (yukarıdaki durumda) Record
, temel sınıflarda uzantı sınıfına sahip olacak şekilde oluşturulan tüm nesneler böylece tüm işlevlerine sahip olacaktır.
Bu kütüphanenin ana avantajı, genişletilebilir nesneleri çalıştıran kodun, uzantı hakkında bilgi sahibi olması gerekmemesidir ve uzantılar, genişletilebilir nesnelerdeki her şeyi değiştirebilir.