11 апреля 2011 г.

Расширение класса при создании свойствами метакласса в Python 2.6

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

Комментариев нет:

Отправить комментарий