gpt4 book ai didi

python - super 和 __new__ 混淆

转载 作者:IT老高 更新时间:2023-10-28 22:18:53 31 4
gpt4 key购买 nike

正如我刚刚学到的,我可以这样使用 super():
super(class, obj_of_class-or-_subclass_of_class)

代码如下:

#Case 1
class A(object):
def __init__(self):
print "A init"

class B(A):
def __init__(self):
print "B init"
super(B, self).__init__() #ok, I can invoke A's __init__ successfully

#Case 2
class A(object):
@classmethod
def foo(cls):
print "A foo"

class B(object):
@classmethod
def foo(cls):
print "B foo"
super(B, cls).foo() #ok, I can invoke A's foo successfully

#Case 3
class A(object):
def __new__(cls):
print "A new"
return super(A, cls).__new__(cls)

class B(A):
def __new__(cls):
print "B new"
return super(B, cls).__new__() #Oops, error

问题:

在情况 1 和 2 中,我可以成功使用 super,而无需指定要操作的 objcls。但是为什么我不能对 __new__ 做同样的事情呢?因为,在案例 3 中,如果我以这种方式使用 super ,则会出现错误。但是如果我这样使用它:

super(B, cls).__new__(cls)

没有错误。

最佳答案

来自 Python release notes关于覆盖 __new__ 方法:

__new__ is a static method, not a class method. I initially thought it would have to be a class method, and that's why I added the classmethod primitive. Unfortunately, with class methods, upcalls don't work right in this case, so I had to make it a static method with an explicit class as its first argument.

由于 __new__ 是一个静态方法,super(...).__new__ 返回一个静态方法。在这种情况下,cls 没有绑定(bind)到第一个参数。所有参数都需要显式提供。

关于python - super 和 __new__ 混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7471255/

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