플러그인 시스템에 대한 또 다른 접근 방식으로 Extend Me project를 확인할 수 있습니다 .
예를 들어 간단한 클래스와 그 확장을 정의 해 봅시다
# 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
파이썬에 모두의 필요 기능 덕분에 다중 상속
클래스 작성을보다 잘 제어하기 위해이 lib에 정의 된 메타 클래스가 거의 없습니다.
이 lib는 OpenERP Proxy Project 에서 사용되며 충분히 작동하는 것 같습니다!
실제 사용 예를 보려면 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
여기에 extesible 객체가 있습니다. RecordDateTime
확장입니다.
확장 기능을 사용하려면 확장 클래스가 포함 된 모듈을 가져 오십시오. 위의 경우 Record
생성 된 모든 객체는 기본 클래스에 확장 클래스가 있으므로 모든 기능을 갖습니다.
이 라이브러리의 주요 장점은 확장 가능한 개체를 운영하는 코드는 확장에 대해 알 필요가 없으며 확장은 확장 가능한 개체의 모든 것을 변경할 수 있다는 것입니다.