Como otro enfoque de sistema de complemento, es posible comprobar Extend Me project.
Por ejemplo, vamos a definir la clase sencilla y su extensión
# 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)
y tratar de usarlo:
>>> 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
Y mostrar lo que se esconde detrás de la escena:
>>> my_cool_obj.__class__.__bases__
[MyCoolClassExtension1, MyCoolClass]
extend_me biblioteca manipula clase creación pr oceso a través de metaclases, por tanto, en el ejemplo anterior, al crear nueva instancia de MyCoolClass
llegamos instancia de la nueva clase que es subclase de ambos MyCoolClassExtension
y MyCoolClass
que tiene funcionalidad de los dos, gracias a Python multiple inheritance
Para un mejor control sobre la creación de clases hay pocas metaclases definidos en este lib:
ExtensibleType
- permite la extensibilidad sencilla subclasificando
ExtensibleByHashType
- similar a eXten sibleType, pero la capacidad para construir versiones especializadas de clase, lo que permite la extensión mundial de clase base y la extensión de versiones especializadas de clase
Este lib se utiliza en OpenERP Proxy Project, y parece estar funcionando lo suficientemente bueno haveing!
Por ejemplo real del uso, busque en OpenERP Proxy 'field_datetime' extension:
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
aquí es objeto extesible. RecordDateTime
es la extensión.
Para habilitar la extensión, solo importe el módulo que contiene la clase de extensión, y (en el caso anterior) todos los objetos Record
creados después tendrán clases de extensión en clases base, teniendo así toda su funcionalidad.
La principal ventaja de esta biblioteca es que, el código que opera objetos extensibles, no necesita saber acerca de la extensión y las extensiones podrían cambiar todo en objetos extensibles.
+1 para el segundo párrafo. Tan verdadero. :-) –
¡Muchas gracias! Escribí un pequeño tutorial basado en su publicación: http://lkubuntu.wordpress.com/2012/10/02/writing-a-python-plugin-api/ – MiJyn
El módulo 'imp' está en desuso en favor de' importlib 'a partir de python 3.4 – b0fh