Во вновь создаваемые классы порой требуется добавить одни и те же атрибуты. Безусловно, это можно решить в ручную, используя механизм наследования. Но тогда код будет разбросан по определениям расширяемых классов. Понятно, что это не совсем удобно. Начиная с версии 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!), указывающую на расширяемый класс.
Комментариев нет:
Отправить комментарий