gpt4 book ai didi

python - 元类的 __new__ 和 __init__ 参数

转载 作者:太空狗 更新时间:2023-10-30 02:51:16 26 4
gpt4 key购买 nike

在元类中覆盖 newinit 时,我对方法调用顺序和不同的参数感到有点惊讶。请考虑以下事项:

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 接收带有参数 nameAHELLO

我想象 __init__super().__new__ 调用:如果调用没有在覆盖的 __new__ 中完成,那么我的 __init__ 没有被调用。

有人可以阐明在这种情况下如何调用 __init__ 吗?

有关我的用例的信息,我想在特殊情况下通过仅提供一个“基”类(而不是元组)在运行时更轻松地创建类,然后我将此代码添加到__新__:

if not isinstance(bases, tuple):
bases = (bases, )

然而,我发现我还需要在__init__中添加它。

最佳答案

你的 __init__ 方法显然被调用了,原因是因为你的 __new__ 方法返回了你的类的一个实例。

来自 https://docs.python.org/3/reference/datamodel.html#object.new :

If __new__() returns an instance of cls, then the new instance’s __init__() method will be invoked like __init__(self[, ...]), where self is the new instance and the remaining arguments are the same as were passed to __new__().

如您所见,传递给 __init__ 的参数是传递给 __new__ 方法调用者的参数,而不是当您使用 super 调用它时。它有点含糊,但如果你仔细阅读它就是这个意思。

关于其余部分,它按预期工作:

In [10]: A.__bases__
Out[10]: (list,)

In [11]: a = A()

In [12]: a.__class__.__bases__
Out[12]: (list,)

关于python - 元类的 __new__ 和 __init__ 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56514586/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com