プラグインシステムへのもう1つのアプローチとして、Extend Meプロジェクトを確認できます。
たとえば、単純なクラスとその拡張を定義しましょう
# 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)
そしてそれを使ってみてください:
>>> 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
そして、舞台裏に隠されているものを示します。
>>> my_cool_obj.__class__.__bases__
[MyCoolClassExtension1, MyCoolClass]
extend_meための例では、メタクラスを経由してライブラリ操作するクラスの作成プロセスを、上記の新しいインスタンスを作成する際にMyCoolClass
、我々は両方のサブクラスである新しいクラスのインスタンスだMyCoolClassExtension
とMyCoolClass
Pythonのにそれらの両方の機能性を有する、感謝を多重継承
クラス作成をより適切に制御するために、このlibで定義されているメタクラスはほとんどありません。
このlibはOpenERPプロキシプロジェクトで使用されていますでており、十分に機能しているようです。
実際の使用例については、OpenERPプロキシの「field_datetime」拡張をご覧ください。
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
これは拡張可能なオブジェクトです。RecordDateTime
拡張です。
拡張機能を有効にするには、拡張クラスを含むモジュールをインポートし、(上記の場合)Record
基本クラスに拡張クラスが含まれるように作成されたすべてのオブジェクトは、すべての機能を持ちます。
このライブラリの主な利点は、拡張可能なオブジェクトを操作するコードが拡張機能について知る必要がなく、拡張機能が拡張可能なオブジェクトのすべてを変更できることです。