杰斯布埃诺说的话。我一直试图在python2中实现这一点,但没有取得太大成功。这是我最近得到的:class MetaTest(type):
_instances = {}
def __init__(cls, name, bases, attrs):
super(MetaTest, cls).__init__(name, bases, attrs)
MetaTest._instances[name] = cls()
class Foo(object):
__metaclass__ = MetaTest
class Bar(Foo):
pass
for name, obj in Bar._instances.items():
print name, obj, type(obj)
输出
^{pr2}$
但是,如果您试图给出Foo或Bar__init__方法,那么由于jsbueno给出的原因,这些方法都会失败。在
下面是一个使用super无参数形式的Python 3.6版本,它更成功:class MetaTest(type):
_instances = {}
def __init__(cls, name, bases, attrs):
print('cls: {}\nname: {}\nbases: {}\nattrs: {}\n'.format(cls, name, bases, attrs))
super().__init__(name, bases, attrs)
MetaTest._instances[name] = cls()
class Foo(metaclass=MetaTest):
def __init__(self):
super().__init__()
class Bar(Foo):
def __init__(self):
super().__init__()
for name, obj in Bar._instances.items():
print(name, obj, type(obj))
输出cls:
name: Foo
bases: ()
attrs: {'__module__': '__main__', '__qualname__': 'Foo', '__init__': , '__classcell__': }
cls:
name: Bar
bases: (,)
attrs: {'__module__': '__main__', '__qualname__': 'Bar', '__init__': , '__classcell__': }
Foo <__main__.foo object at>
Bar <__main__.bar object at>
我必须承认,我对类自动创建一个自己的实例的整个概念不太满意:“显式比隐式好”。我认为jsbueno建议使用注册函数是一个很好的折衷方案。在