Explicit passing of Self when calling super class's __init__ in python
这个问题与"super"在python中的作用有关?,如何初始化基本(超级)类?和python:如何从超类创建子类?它描述了从
1 2 3 4 5 6 7 8 9 10 11 12 13 | class SuperClass: def __init__(self): return def superMethod(self): return ## One version of Initiation class SubClass(SuperClass): def __init__(self): SuperClass.__init__(self) def subMethod(self): return |
或
1 2 3 4 5 6 7 8 9 10 11 12 | class SuperClass: def __init__(self): return def superMethod(self): return ## Another version of Initiation class SubClass(SuperClass): def __init__(self): super(SubClass, self).__init__() def subMethod(self): return |
号
所以我对需要显式地将
1 | TypeError: __init__() missing 1 required positional argument: 'self' |
)但当调用构造函数或任何其他类方法(即:
1 2 3 4 5 6 7 8 | ## Calling class constructor / initiation c = SuperClass() k = SubClass() ## Calling class methods c.superMethod() k.superMethod() k.subMethod() |
。
)隐式传递
我对EDCOX1的2个关键字的理解是,它与C++中的EDCOX1×8指针无关,而它提供了对类实例的引用。这是正确的吗?
如果总是有一个当前实例(在本例中是
谢谢
这只是简单的方法绑定,与
当您通过类调用(普通)方法时,不会发生这种绑定。如果方法期望其第一个参数是一个实例(例如
这种绑定行为的实际实现非常整洁。如果python对象有一个
python的
下面的例子可能会说明一些事情:
1 2 3 4 5 6 7 8 9 | class Example: def method(self): pass >>> print(Example.method) <unbound method Example.method> >>> print(Example().method) <bound method Example.method of <__main__.Example instance at 0x01EDCDF0>> |
绑定方法时,将隐式传递实例。当方法未绑定时,需要显式传递实例。
其他答案肯定会提供关于绑定过程的更多细节,但我认为值得展示上面的代码片段。
答案是不平凡的,可能会保证一篇好文章。Raymond Hettinger在Pycon 2015年的演讲中对
python的
super() 需要有一个对象,在该对象上调用被重写的方法,因此它是用self显式传递的。这不是唯一可能的实现,事实上,在Python3中,不再需要您传递自实例。Python EDCOX1 9不象Java,或其他编译语言EDCOX1,12。正如Hettinger的谈话中所解释的,Python的实现旨在支持多协作继承范式。这在python中有一个有趣的结果:
super() 中的方法解析不仅依赖于父类,还依赖于子类(多重继承的结果)。注意,Hettinger使用的是python 3。
小精灵
关于
因为在