gpt4 book ai didi

python - 在 python 中调用父类(super class)的 __init__ 时显式传递 Self

转载 作者:行者123 更新时间:2023-11-28 21:47:24 27 4
gpt4 key购买 nike

此问题与 What does 'super' do in Python? 上的帖子有关, How do I initialize the base (super) class? , 和 Python: How do I make a subclass from a superclass?它描述了从 SubClass 中初始化 SuperClass 的两种方法

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

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

所以我对需要显式self作为参数传递给父类(super class).__init__(self)super(SubClass, self).__init__()。(事实上​​ ,如果我调用 SuperClass.__init__() 我会得到错误

TypeError: __init__() missing 1 required positional argument: 'self'

)。但是当调用构造函数或任何其他类方法时(即:

## Calling class constructor / initiation
c = SuperClass()
k = SubClass()

## Calling class methods
c.superMethod()
k.superMethod()
k.subMethod()

),self 参数被隐式 传递。

我对 self 关键字的理解是它与 C++ 中的 this 指针没有什么不同,但它提供了对类实例的引用。这是正确的吗?

如果总是有一个当前实例(在本例中为 SubClass),那么为什么 self 需要显式包含在对 SuperClass 的调用中。 __init__( self )?

谢谢

最佳答案

这只是简单的方法绑定(bind),与super关系不大。当您可以 x.method(*args) 时,Python 检查 x 的类型以查找名为 method 的方法。如果它找到一个,它会将函数“绑定(bind)”到 x,这样当您调用它时,x 将作为第一个参数传递,在其余参数之前.

当您通过其类调用(普通)方法时,不会发生此类绑定(bind)。如果该方法希望它的第一个参数是一个实例(例如 self),您需要自己传递它。

这个绑定(bind)行为的实际实现非常简洁。如果 Python 对象具有 __get__ 方法(和/或 __set____delete__ 方法,则它们是“描述符”,但这些对方法无关紧要).当您查找像 a.b 这样的属性时,Python 会检查 a 的类以查看它是否具有作为描述符的属性 b。如果是,它会将 a.b 转换为 type(a).b.__get__(a, type(a))。如果 b 是一个函数,它将有一个 __get__ 方法来实现我上面描述的绑定(bind)行为。其他种类的描述符可以有不同的行为。例如,classmethod 装饰器将一个方法替换为一个特殊的描述符,该描述符将函数绑定(bind)到类,而不是实例。

Python 的 super 创建了特殊对象,这些对象处理属性查找的方式与普通对象不同,但细节对于这个问题来说并不重要。通过 super 调用的方法的绑定(bind)行为就像我在第一段中描述的那样,所以 self 在调用时自动传递给绑定(bind)的方法。 super 唯一的特别之处在于它可能绑定(bind)一个不同的函数,而不是你在 self 上查找相同的方法名称(这就是使用它的全部意义) .

关于python - 在 python 中调用父类(super class)的 __init__ 时显式传递 Self,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36557009/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com