Eine weitere Möglichkeit, sich dem Plugin-System zu nähern, ist die Überprüfung Projekt "Extend Me .
Definieren wir zum Beispiel eine einfache Klasse und ihre Erweiterung
# 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)
Und versuchen Sie, sie zu nutzen:
>>> 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
Und zeigen, was sich hinter den Kulissen verbirgt:
>>> my_cool_obj.__class__.__bases__
[MyCoolClassExtension1, MyCoolClass]
erweitern_ich Bibliothek manipuliert den Prozess der Klassenerstellung über Metaklassen, so dass im obigen Beispiel beim Erstellen einer neuen Instanz von MyCoolClass
haben wir eine Instanz einer neuen Klasse, die eine Unterklasse von beiden ist MyCoolClassExtension
y MyCoolClass
mit der Funktionalität von beiden, dank Pythons Mehrfachvererbung
Zur besseren Kontrolle der Klassenerstellung sind in dieser Bibliothek einige Metaklassen definiert:
-
ExtensibleType
- ermöglicht eine einfache Erweiterbarkeit durch Unterklassenbildung
-
ExtensibleByHashType
- ähnlich wie ExtensibleType, aber mit der Fähigkeit spezialisierte Versionen von Klassen zu erstellen, die eine globale Erweiterung der Basisklasse und die Erweiterung von spezialisierten Versionen der Klasse
Diese Bibliothek wird verwendet in OpenERP Proxy Projekt und es scheint gut genug zu funktionieren!
Ein konkretes Beispiel für die Verwendung finden Sie unter OpenERP Proxy 'field_datetime' Erweiterung :
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
ist hier ein erweiterbares Objekt. RecordDateTime
ist die Erweiterung.
Um die Erweiterung zu aktivieren, importieren Sie einfach das Modul, das die Erweiterungsklasse enthält, und (im obigen Fall) alle Record
Objekte, die danach erstellt werden, haben die Erweiterungsklasse in ihren Basisklassen und verfügen somit über die gesamte Funktionalität.
Der Hauptvorteil dieser Bibliothek ist, dass Code, der erweiterbare Objekte bedient, nichts über Erweiterungen wissen muss und dass Erweiterungen alles in erweiterbaren Objekten ändern können.