首页 > 解决方案 > 继承类在python 3.x中如何使用bass类的__new__函数?

问题描述

在 Python 3.x 中,继承类使用__new__函数还是它自己的函数?在下面的代码中,有两个__new__函数,如何调用它们?

class A:
    def __new__(cls):
        print("A",cls)
        return super().__new__(cls)

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


a = A()
print("-----------")
b = B()

输出 :

A <class '__main__.A'>
-----------
<class '__main__.B'>
A <class '__main__.B'>

标签: pythonpython-3.x

解决方案


您的代码应该略有不同。首先,由于 A 不继承任何类,因此编写 没有意义super().__new__(cls)Super()返回直接父类。其次,Python 中的“this”参数通常称为self.

无论如何,你确定你的意思是__new__而不是__init__看看这里的区别

class A:
    def __new__(self):
        print("A",self)
        return super().__new__(self)

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


a = A()
print("-----------")
b = B()

让我们看看输出:

A <class '__main__.A'>
-----------
<class '__main__.B'>
A <class '__main__.B'>

创建 A 时,只调用 A 的构造函数。创建 B 时,首先打印类 B 的标志,然后调用 A 的构造函数(使用super()函数)。


推荐阅读