Python 与新样式类一起使用super时的困惑
我有这个:Python 与新样式类一起使用super时的困惑,python,Python,我有这个: #! /usr/bin/env python class myclass1(object): def __new__(cls,arg): print cls, arg, "in new" ss = super(object,cls) print ss, type(ss) ss.__new__(cls,arg) #
#! /usr/bin/env python
class myclass1(object):
def __new__(cls,arg):
print cls, arg, "in new"
ss = super(object,cls)
print ss, type(ss)
ss.__new__(cls,arg)
# super(object,cls).__new__(cls,arg)
# return object.__new__(cls,arg)
def __init__(self,arg):
self.arg = arg + 1
print self, self.arg, "in init"
if __name__ == '__main__':
m = myclass1(56)
它给出了一个错误:
$ ./newtest.py
<class '__main__.myclass1'> 56 in new
<super: <class 'object'>, <myclass1 object>> <type 'super'>
Traceback (most recent call last):
File "./newtest.py", line 23, in <module>
m = myclass1(56)
File "./newtest.py", line 9, in __new__
ss.__new__(cls,arg)
TypeError: super.__new__(myclass1): myclass1 is not a subtype of super
$./newtest.py
纽约56号
回溯(最近一次呼叫最后一次):
文件“/newtest.py”,第23行,在
m=myclass1(56)
文件“/newtest.py”,第9行,新__
ss.\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
TypeError:super.\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
错误是有效的。我明白了。然而,我现在对本页文档中关于_;新_;的内容感到困惑:
问题:根据上述文档,我做错了什么。我对文档的理解差距在哪里?您基本上需要在
ss=super(object,cls)
中将object
替换为myclass1
<代码>对象没有超类<代码>myclass1执行。您还需要从ss中删除args
。\uuuuu new\uuuu(cls,args)
作为对象。\uuuuuu new\uuuu
只有一个参数cls
。最终代码应为:
def __new__(cls,arg):
print cls, arg, "in new"
ss = super(myclass1,cls)
print ss, type(ss)
ss.__new__(cls)
# super(object,cls).__new__(cls,arg)
# return object.__new__(cls,arg)
您对文档理解的差距在于super
的第一个参数是您想要获取其超类的类。而不是超类本身。如果您已经知道超类,或者想要硬编码一个固定的超类,那么您很可能已经用object
替换ss
,并编写:
def __new__(cls,arg):
print cls, arg, "in new"
# ss = super(myclass1,cls)
print object, type(object)
object.__new__(cls)
# super(object,cls).__new__(cls,arg)
# return object.__new__(cls,arg)
Super通常不用于
\uuuu new\uuuu
中,因为\uuuu new\uuuu
是一种静态方法。此时,对象甚至还不存在,因此没有要调用的超级对象
请参阅有关重写
\uuuuu new\uuuu
的具体方法的说明,我认为这不对。如果查看super
的帮助,您将看到super(type,type2)->绑定的super对象;需要issubclass(类型2,类型)
。那么我使用的super调用不是正确的吗?来自super的文档:如果省略了第二个参数,则返回的super对象是未绑定的。如果第二个参数是对象,则isinstance(obj,type)必须为true。如果第二个参数是类型,则issubclass(type2,type)必须为true(这对classmethods很有用)。从文档中(为了简单起见,省略“或同级”):“super(type[,object或type])-返回一个代理对象,该代理对象将方法调用委托给类型的父类。”这里,单词type
指的是参数,而不是父类的类型。为了解释它,我意识到文档是相当模糊的。如果他们调用了参数a
,它会更清晰。issubclass(type2,type)
只是super
的要求之一,而不是代码不起作用的原因。原因是您请求的是类对象的超类,但它不存在。当您将\uuu new\uuu
应用于ss
时,classsuper
会尝试委托/代理它。当它找不到基础类时,它认为收件人就是它自己,并失败,因为myclass1
不是子类。@abc确定。我发现了别的东西。同一页文档包含一个示例<代码>C类(B)然后他们使用super(C,self)
。如果你说的是对的,他们不应该使用super(B,self)
?