Во вновь создаваемые классы порой требуется добавить одни и те же атрибуты. Безусловно, это можно решить в ручную, используя механизм наследования. Но тогда код будет разбросан по определениям расширяемых классов. Понятно, что это не совсем удобно. Начиная с версии 2.6 в Python можно решить элегантно эту задачу, используя метаклассы.
Вот простейший пример расширения класса при создании:
def _f1(obj):
return obj.value * 4
def _f2(obj, value):
return value + ' additional'
class Meta(type):
def __new__(meta, classname, supers, classdict):
classdict['f1'] = _f1
classdict['f2'] = _f2
return type.__new__(meta, classname, supers, classdict)
class Spam(object):
def __init__(self, value):
self.value = value
def f(self):
return self.value * 2
__metaclass__ = Meta
o = Spam('text ')
print 'Extendable object inner function f: ', o.f()
print 'Extendable object additional function f1: ', o.f1()
print 'Extendable object additional function f2: ', o.f2('blah-blah-blah ')
Необходимыми условиями являются:
- метакласс должен наследоваться от type;
- расширяемый класс должен наследоваться от object;
- в расширяемом классе необходимо определить переменную __metaclass__ (только с версии 2.6!), указывающую на расширяемый класс.
Отправить комментарий