Woo*_*ath 9 python subclass self super superclass
这个问题与What does 'super' do in Python? 的帖子有关。,如何初始化基(超)类?和Python:如何从超类创建子类?SuperClass它描述了从SubClassas内部初始化 a 的两种方法
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
Run Code Online (Sandbox Code Playgroud)
或者
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
Run Code Online (Sandbox Code Playgroud)
所以我对需要在
and
中显式传递self参数
感到有点困惑。(事实上,如果我打电话我会得到错误SuperClass.__init__(self)super(SubClass, self).__init__()SuperClass.__init__()
TypeError: __init__() missing 1 required positional argument: 'self'
Run Code Online (Sandbox Code Playgroud)
)。但是当调用构造函数或任何其他类方法时(即:
## Calling class constructor / initiation
c = SuperClass()
k = SubClass()
## Calling class methods
c.superMethod()
k.superMethod()
k.subMethod()
Run Code Online (Sandbox Code Playgroud)
),self参数是隐式传递的。
我对self关键字的理解是它与 C++ 中的指针没有什么不同this,但它提供了对类实例的引用。它是否正确?
如果总是有一个当前实例(在本例中SubClass),那么为什么self需要显式包含在对 的调用中SuperClass.__init__(self)?
谢谢
这只是方法绑定,与super. 如果可以的话,Python 会检查名为 的方法x.method(*args)的类型。如果找到一个,它会将函数“绑定”到,以便当您调用它时,它将作为第一个参数在其余参数之前传递。xmethodxx
当您通过其类调用(普通)方法时,不会发生此类绑定。如果该方法期望其第一个参数是一个实例(例如self),则您需要自己将其传递。
这种绑定行为的实际实现非常简洁。如果 Python 对象有一个__get__方法(和/或__set__或__delete__方法,但这些对于方法来说并不重要),那么它们就是“描述符”。当您查找诸如 之类的属性时a.b,Python 会检查 的类以查看它是否具有作为描述符的a属性。b如果是的话,它会转化a.b为type(a).b.__get__(a, type(a)). 如果b是一个函数,它将有一个__get__实现我上面描述的绑定行为的方法。其他类型的描述符可以有不同的行为。例如,classmethod装饰器用特殊描述符替换方法,该描述符将函数绑定到类而不是实例。
Pythonsuper创建了特殊的对象,它们处理属性查找的方式与普通对象不同,但细节对于这个问题来说并不重要。通过调用的方法的绑定行为super就像我在第一段中描述的那样,因此self在调用时会自动传递给绑定方法。唯一特别的是super,它可能绑定一个与查找相同方法名称不同的函数self(这就是使用它的全部意义)。
下面的例子可能会说明一些事情:
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>>
Run Code Online (Sandbox Code Playgroud)
绑定方法时,会隐式传递实例。当方法未绑定时,需要显式传递实例。
其他答案肯定会提供有关绑定过程的更多细节,但我认为值得展示上面的代码片段。
因为在 中SuperClass.__init__(self),您调用的是类上的方法,而不是实例上的方法,因此它不能隐式传递。同样,你不能只调用SubClass.subMethod(),但你可以调用SubClass.subMethod(k)它,它相当于k.subMethod()。类似地, ifself指的是then SubClass,所以如果你想调用,你必须直接调用它。self.__init__()SubClass.__init__(self)SuperClass.__init