针对元类中重载new
和init
时的方法调用顺序和不同参数,我感到有些惊讶。请看下面的示例:
class AT(type):
def __new__(mcs, name, bases, dct):
print(f"Name as received in new: {name}")
return super().__new__(mcs, name + 'HELLO', bases + (list,), dct)
def __init__(cls, name, bases, dct):
print(f"Name as received in init: {name}")
pass
class A(metaclass=AT):
pass
A.__name__
输出结果为:
Name as received in new: A
Name as received in init: A
'AHELLO'
简而言之,我本以为
init
会在传入name
参数的情况下接收到AHELLO
。我想象
__init__
是由super().__new__
调用的:如果在重写的__new__
中没有进行调用,则我的__init__
不会被调用。有人能澄清一下在这种情况下如何调用
__init__
吗?提供的信息是,我希望通过只提供一个“基类”(而不是元组)来使特殊情况下类的创建更加容易,在
__new__
中添加了以下代码:if not isinstance(bases, tuple):
bases = (bases, )
然而,我发现我还需要在__init__
中添加它。