Как отметил Майкл Мерикель, функции getClass()
должны возвращать один и тот же объект при каждом вызове, чтобы ваше наследование работало.Класс, который просто идентичен, недостаточно хорош.Вот один из способов сделать это: использовать класс, чтобы он действовал как ваши getClass()
функции.Поскольку определение класса выполняется только один раз, MyMetaClass1
всегда является одним и тем же объектом при возврате.
class getClass1(object):
class MyMetaClass1(type):
def __new__(cls, name, bases, dct):
print dct.get("Attr","")+"Meta1"
return super(MyMetaClass1, cls).__new__(cls, name, bases, dct)
class __metaclass__(type):
def __call__(cls):
return cls.MyMetaClass1
Вы также можете сделать это так, используя реальную функцию и используя изменяемый аргумент по умолчанию для кэшированияэкземпляр класса:
def getClass1(cls=[]):
if not cls:
class MyMetaClass1(type):
def __new__(cls, name, bases, dct):
print dct.get("Attr","")+"Meta1"
return super(MyMetaClass1, cls).__new__(cls, name, bases, dct)
cls.append(MyMetaClass1)
return cls[0]
Здесь вы заметите повторяющуюся тему: злоупотребление функциями Python.:-) Это, как правило, признак того, что вы делаете что-то, что может быть сделано лучше другим способом.Например, почему вы используете фабрики, а не просто определяете класс обычным способом?Я видел, что фабрики классов имеют какое-то применение, но я не думаю, что когда-либо видел фабрику метаклассов в дикой природе.