Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 与新样式类一起使用super时的困惑_Python - Fatal编程技术网

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
时,class
super
会尝试委托/代理它。当它找不到基础类时,它认为收件人就是它自己,并失败,因为
myclass1
不是子类。@abc确定。我发现了别的东西。同一页文档包含一个示例<代码>C类(B)然后他们使用
super(C,self)
。如果你说的是对的,他们不应该使用
super(B,self)