【发布时间】:2025-12-08 16:15:01
【问题描述】:
我有一个玩具 python 示例,其中将内联元类定义为函数与将其定义为类的行为不同,我试图了解原因:
>>> class Test(object):
... def __metaclass__(name, bases, nmspc):
... cls = type(name, bases, nmspc)
... def __init__(self, field, *args, **kwargs):
... print "making " + field
... super(cls, self).__init__()
... cls.__init__ = __init__
... return cls
...
>>> t = Test('lol')
making lol
>>> class Test2(Test): pass
...
>>> t = Test2('lol')
making lol
对比:
>>> class Test(object):
... class __metaclass__(type):
... def __init__(cls, name, bases, nmspc):
... type.__init__(cls, name, bases, nmspc)
... def __init__(self, field, *args, **kwargs):
... print "making " + field
... super(cls, self).__init__()
... cls.__init__ = __init__
...
>>> t = Test('lol')
making lol
>>> class Test2(Test): pass
...
>>> t2 = Test2('lol')
making lol
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 7, in __init__
TypeError: __init__() takes at least 2 arguments (1 given)
那么,定义一个类和定义一个函数到底有什么不同呢?它们最终都通过稍微不同的方式返回一个类,因为修改后的 cls.__init__ 以一种方式被继承,而不是另一种。
我还通过在外部进行函数和类声明来检查类似的构造,我得到了相同的行为。
【问题讨论】:
-
您的问题似乎是 “为什么不同的事物会有不同的行为?” - 您能澄清一下您的预期吗?
-
我期待 __metaclass__ 的两个定义的子类获得相同的 __init__ 方法。