python - super() 在 Python 3 中究竟返回什么?

标签 python python-3.x inheritance

<分区>

来自 Python3 的文档 super() “返回一个代理对象,该对象将方法调用委托(delegate)给类型的父类或兄弟类。”这是什么意思?

假设我有以下代码:

class SuperClass():
    def __init__(self):
        print("__init__ from SuperClass.")
        print("self object id from SuperClass: " + str(id(self)))

class SubClass(SuperClass):
    def __init__(self):
        print("__init__ from SubClass.")
        print("self object id from SubClass: " + str(id(self)))
        super().__init__()


sc = SubClass()

我从这里得到的输出是:

__init__ from SubClass.
self object id from SubClass: 140690611849200
__init__ from SuperClass.
self object id from SuperClass: 140690611849200

这意味着在 super().__init__() 行中,super() 返回当前对象,然后将其隐式传递给父类(super class)' __init__() 方法。这是准确的还是我在这里遗漏了什么?

简单来说,我想了解以下内容:

super().__init__() 运行时,

  1. 传递给 __init__() 的到底是什么以及如何传递的?我们在 super() 上调用它,因此根据我目前对 Python 的了解,无论返回什么都应该传递给 __init__() 方法。
  2. 为什么我们不必将 self 传递给 super().__init__()

最佳答案

returns a proxy object that delegates method calls to a parent or sibling class of type.

这个proxy 是一个对象,充当父类的方法调用部分。它不是类(class)本身;相反,它只是足以让您可以使用它来调用父类方法的信息。

如果调用 __init__(),您将获得自己的本地子类 __init__ 函数。当您调用 super() 时,您将获得该代理对象,它将您重定向到父类方法。因此,当您调用 super().__init__() 时,该代理会将调用重定向到父类 __init__ 方法。

类似地,如果您要调用 super().foo,您将从父类获得 foo 方法——同样,由该代理重新路由.

你清楚吗?

对OP评论的回应

But that must mean that this proxy object is being passed to __init__() when running super().__init__() right?

错了。代理对象就像一个包名,比如调用math.sqrt()。您不是将 math 传递给 sqrt,而是使用它来表示您使用的是哪个 sqrt。如果您想将代理传递给 __init__,调用将是 __init__(super())。当然,这种调用在语义上是荒谬的。

When we have to actually pass in self which is the sc object in my example.

不,你没有传入sc;这是对象创建调用(内部方法 __new__)的结果,其中包括对 init 的调用。对于 __init__self 对象是 Python 运行时系统为您创建的新项。对于大多数类方法,第一个参数(在其他语言中称为 self,在其他语言中称为 this)是调用该方法的对象。

关于python - super() 在 Python 3 中究竟返回什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44725483/

相关文章:

python - 如何用python类中的方法替换装饰器

python - 使用类扩展 Django ModelForm

python - 提取span标签内的信息

python - 具有复杂 numpy 数组和 native 数据类型的 numba TypingError

c++ - 复制构造函数不被继承

generics - TypeScript 中静态方法的抽象方法版本

python - 提取开始标记和结束标记之间的所有字符串

python - 为 mysql-python (MySQLdb) 更改 django 中的 CLIENT_FOUND_ROWS 标志?

REGEX 匹配 10 位数字且必须包含数字 4

java - 将final关键字添加到继承/重写的方法中是否为 "ok"?