Sebagai satu sama lain pendekatan untuk sistem plugin, Anda dapat memeriksa proyek Extend Me .
Sebagai contoh, mari kita mendefinisikan kelas sederhana dan ekstensinya
# 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)
Dan cobalah untuk menggunakannya:
>>> 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
Dan tunjukkan apa yang tersembunyi di balik layar:
>>> my_cool_obj.__class__.__bases__
[MyCoolClassExtension1, MyCoolClass]
ext_me library memanipulasi proses pembuatan kelas melalui metaclasses, jadi dalam contoh di atas, ketika membuat instance baru MyCoolClass
kita mendapat instance kelas baru yang merupakan subkelas keduanya MyCoolClassExtension
dan MyCoolClass
memiliki fungsionalitas keduanya, berkat pewarisan berganda Python
Untuk kontrol yang lebih baik atas pembuatan kelas ada beberapa metaclasses didefinisikan dalam lib ini:
ExtensibleType
- memungkinkan ekstensibilitas sederhana dengan subclassing
ExtensibleByHashType
- Mirip dengan ExtensibleType, tetapi memiliki kemampuan untuk membangun versi kelas khusus, memungkinkan ekstensi global kelas dasar dan ekstensi versi kelas khusus
Lib ini digunakan dalam Proyek Proxy OpenERP , dan tampaknya berfungsi cukup baik!
Untuk contoh nyata penggunaan, lihat di ekstensi OpenERP Proxy '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
di sini adalah objek yang dapat diperpanjang. RecordDateTime
adalah ekstensi.
Untuk mengaktifkan ekstensi, cukup impor modul yang berisi kelas ekstensi, dan (dalam hal di atas) semua Record
objek yang dibuat setelah itu akan memiliki kelas ekstensi di kelas dasar, sehingga memiliki semua fungsinya.
Keuntungan utama dari pustaka ini adalah bahwa, kode yang mengoperasikan objek yang dapat diperluas, tidak perlu tahu tentang ekstensi dan ekstensi dapat mengubah segalanya dalam objek yang dapat diperluas.