我正在尝试使用元类来自动注册子类,
但是下面的代码在类Dep\u A的行中抛出一个错误
super(Dep_A,self).__init__().
*NameError: global name 'Dep_A' is not defined*
尝试元类中的注释行,但出现相同的错误。 我知道这在不使用元类时是有效的,所以如何初始化父类的init方法呢
registry = {}
def register(cls):
print cls.__name__
registry[cls.__name__] = cls()
return cls
class MetaClass(type):
def __new__(mcs, clsname, bases, attrs):
# newclass = super(MetaClass, mcs).__new__(mcs, clsname, bases, attrs)
newclass = type.__new__(mcs,clsname, bases, attrs)
register(newclass)
return newclass
class Department(object):
__metaclass__ = MetaClass
def __init__(self):
self.tasks = dict()
class Dep_A(Department):
def __init__(self):
super(Dep_A,self).__init__()
...
您的
register
函数试图在实际定义全局名称之前实例化Dep_A
。(也就是说,在Dep_A
将调用结果赋给元类之前,它在class语句体仍在执行时被调用。)您希望存储类本身:
您正试图在
class
语句完成之前创建类的实例。类对象已创建,但尚未分配给全局名称。你知道吗事件的顺序是:
class Dep_A
语句,执行类主体以形成属性(创建__init__
函数)。你知道吗__new__
方法时使用类名、基和类主体名称空间('Dep_A'
、(Department,)
和{'__init__': <function ...>, ...}
)。你知道吗registry()
,传递新的类对象registry()
调用类对象__init__
方法通常,当元类
__new__
方法返回新创建的对象时,Dep_A
被赋值。在此之前,没有分配全局名称Dep_A
,因此super(Dep_A, self).__init__()
调用失败。你知道吗您可以先从那里设置名称:
或者,不要尝试在注册表中创建实例,而是存储一个类。以后可以创建一个实例。你知道吗
下面实现了一个注册表,该注册表在以后需要时透明地创建实例,并仅存储创建的一个实例:
现在,类存储在单独的映射中,只有稍后从注册表映射中查找类时,才会创建并缓存实例:
相关问题 更多 >
编程相关推荐