__new__ 中的 cls 有什么作用?

约翰尼

最近我在学习 python 魔术方法,__new__因为我们总是重写它

class A:
    def __new__(cls):
        # ......
        return super().__new__(cls)

    def __init__(self):
        # .....

此方法将返回一个 A 对象,然后 A 将执行__init__
所以,我尝试以下脚本



class A:
    def __init__(self):
        print('A.__init__')
        self.a = 20


class B:
    def __new__(cls):
        print('B.__new__')
        return super().__new__(A)

    def __init__(self):
        print('B.__init__')
        self.b = 30


t = B()
print(type(t))

然后我得到结果

B.__new__
<class '__main__.A'>

在我看来,B.__new__返回一个对象,因为它显示的话,就应该执行A.__init__的方法,但实际上既没有A.__init__,也不B.__init__执行,对象t是一个对象,但它没有什么涉及到A或B,这让我困惑,什么是cls__new__方法步骤为?

沃姆巴茨

在我看来,B.__new__返回一个 A 对象,就像它显示的那样,然后它应该执行A.__init__方法

这种假设是不正确的。让我们看看创建实例的代码。在python中,这将是type.__call__方法。C 实现可以在这里找到

发生的三个有趣的步骤是:

  1. 打电话type.__new__(type, ...)这里
  2. 当中止的返回值__new__不是一个子类type在这里
  3. 调用__init__创建的对象(此处

或者在python代码中:

# t = B() is roughly equivalent to

t = B.__new__()  # which returns `A.__new__()`
if ìssubclass(type(t), B):  # False
    t.__init__()  # never called

B.__new__然而,您的实现会创建一个类型为 的对象A因此,issubclass检查失败并且 no__init__被调用。

总结:B.__init__不叫,因为B.__new__没有创造类型的对象BA.__init__没有被调用,因为类对象A是不负责创建实例(B是)。

最终结果是,这t是一个类的实例,A但它__init__没有被调用。t就是未初始化的原因

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么__new__方法在超级方法中调用其父级的__new__时需要传递cls参数?

Python __new__-cls与__new__所在的类有什么不同

Windows 批处理文件中的@CLS 有什么作用

在__new__中实例化一个具有不同__new__签名的孩子

cls()函数在类方法中做什么?

在__new__中使用object .__ new__有什么缺点?

为什么对象在python中__new__之后没有获取类的属性和方法?

为什么Javac允许“ new CLS()。new InnerCLS()”编译?

为什么Python新型类中的__new__不是类方法?

为什么Python新型类中的__new__不是类方法?

为什么检查cls是否是__subclasshook__中的类?

将只有`__new__`的Python类导入到Robot Framework中

分数模块中的__new__

Python中的__new__和__init__

PyCharm中__new__的错误调用参数

为什么调用元类的__new__

Java wrt类加载器中的“ new”有什么作用?

为什么带有参数的object .__ new__在Python 2.x中不能正常工作,而在Python 3.3+中却不能正常工作?

为什么__new__没有classmethod装饰器

什么是loss_cls和loss_bbox?为什么在训练中它们始终为零

Java8中的函数如何获取Cls::func(Cls cls)的引用返回Object;

当我告诉cls时,为什么在CMD中打印此行?

Python中重写__new__方法的真实示例

在__new__中更改arg不会继承__init__

Python 3.4和2.7中的super .__ new__上的TypeError

正确覆盖python3中的__new__

Python:如何理解内置对象类中定义的 __new__ ?

通过覆盖__new__装饰类方法不起作用?

Python 3默认情况下是什么“ __new__”?