เป็นหนึ่งในวิธีการอื่นเพื่อระบบปลั๊กอินคุณสามารถตรวจสอบขยายโครงการฉัน
ตัวอย่างเช่นลองนิยามคลาสแบบง่ายและส่วนขยาย
# 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ห้องสมุดกระบวนการสร้างปรุงแต่งระดับผ่าน metaclasses ดังนั้นในตัวอย่างข้างต้นเมื่อมีการสร้างตัวอย่างใหม่ของMyCoolClass
เราได้เช่นการเรียนใหม่ที่เป็น subclass ของทั้งสองMyCoolClassExtension
และMyCoolClass
มีการทำงานของทั้งสองคนต้องขอบคุณ ธมรดกหลาย
เพื่อควบคุมการสร้างคลาสได้ดีขึ้นมี metaclasses สองสามตัวที่กำหนดไว้ใน lib นี้:
lib นี้ใช้ในโครงการ OpenERP Proxyและดูเหมือนว่าจะทำงานได้ดีพอ!
สำหรับตัวอย่างการใช้งานจริงให้ดูในส่วนขยาย 'field_datetime' ของ 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
นี่คือวัตถุที่ขยายออกได้ RecordDateTime
เป็นส่วนขยาย
หากต้องการเปิดใช้งานส่วนขยายเพียงแค่นำเข้าโมดูลที่มีคลาสส่วนขยายและ (ในกรณีข้างต้น) Record
วัตถุทั้งหมดที่สร้างขึ้นหลังจากนั้นจะมีคลาสส่วนขยายในคลาสฐานจึงมีการใช้งานทั้งหมด
ข้อได้เปรียบหลักของไลบรารีนี้คือรหัสที่ใช้งานวัตถุที่ขยายได้ไม่จำเป็นต้องรู้เกี่ยวกับส่วนขยายและส่วนขยายสามารถเปลี่ยนแปลงทุกอย่างในวัตถุที่ขยายได้