如何解决为什么在“ superA,self”中,对象先于“ self”? 内置函数:super([type[, object-or-type]])
我想知道为什么调用超类的构造函数的语法在Child
之前将self
对象作为参数传递,以及这些参数对继承方法的目的有什么作用的父类。
class Child(SomeBaseClass):
def __init__(self):
super(Child,self).__init__()
我已经阅读了以下帖子,但是我都找到了理由:
-
在this post中,我找到了这句话:
super(class,subclass).method返回的是绑定方法,而不是未绑定的方法
但仍然无法理解这种语法的含义。
赞赏此语法的详细说明。
解决方法
super
参数的顺序反映了Python的未绑定和绑定方法/描述符的思想。简而言之,第二个参数是可选,因此必须在所需的第一个参数之后。
内置函数:super([type[,object-or-type]])
[...]
如果省略第二个参数,则返回的超级对象未绑定。如果第二个参数是一个对象,则isinstance(obj,type)必须为true。如果第二个参数是类型,则issubclass(type2,type)必须为true(这对于类方法很有用)。
这反映了方法调用self.method()
等效于Class.method(self)
,即操作数的顺序是Class
然后是self
。*
Python方法/描述符有两种样式:其定义类为 unbound 和其实例为 bound 。*
>>> class Base:
... def method(self): print('called Base method')
...
>>> Base.method # unbound method
<function __main__.Base.method(self)>
>>> Base().method # bound method
<bound method Base.method of <__main__.Base object at 0x10dd0e910>>
>>> Base().method()
called Base method
通过获取未绑定的描述符并将其绑定到实例来创建绑定的描述符。这是用描述符协议编码和实现的。
>>> instance = Base()
>>> unbound = Base.method
>>> unbound.__get__(instance)
<bound method Base.method of <__main__.Base object at 0x10dd14510>>
>>> unbound.__get__(instance)()
called Base method
super
类型默认为未绑定。通过描述符协议或通过实例绑定它是等效的。
>>> class Child(Base): ...
>>> instance = Child()
>>> super(Child,instance)
<super: __main__.Child,<__main__.Child at 0x10dcda9d0>>
>>> super(Child).__get__(instance)
<super: __main__.Child,<__main__.Child at 0x10dcda9d0>>
无论哪种情况,必须先在实例之前传递类。
添加“ super”,这是另一种具有神奇属性的新对象类型。
super(type)->未绑定的超级对象
super(type,obj)->绑定的超级对象;需要isinstance(obj,type)
通常用于调用协作超类方法:
class C(B): def meth(self,arg): super(C,self).meth(arg);
*
此描述掩盖了描述符协议的详细信息。例如,方法/描述符也可以绑定到类。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。