【发布时间】:2017-11-27 06:32:51
【问题描述】:
来自 Python3 的文档 super()“返回一个代理对象,它将方法调用委托给类型的父类或同级类。”这是什么意思?
假设我有以下代码:
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__。 来自子类的自我对象 ID:140690611849200 __init__ 来自超类。 来自超类的自我对象 ID:140690611849200这意味着在super().__init__() 行中,super() 返回当前对象,然后隐式传递给超类的__init__() 方法。这是准确的还是我在这里遗漏了什么?
简单地说,我想了解以下内容:
当super().__init__() 运行时,
- 究竟是什么传递给
__init__()以及如何传递?我们在super()上调用它,所以根据我目前对 Python 的了解,无论返回什么都应该传递给__init__()方法。 - 为什么我们不必将
self传递给super().__init__()?
【问题讨论】:
-
是什么让你认为它是同一个对象?
-
因为它们具有与我的示例相同的对象 ID。无论 super 返回什么,不是都传递给
__init__吗? -
不。
super().__init__()不会将super实例传递给__init__;它通过了SubClass实例。 -
您没有获得
superobject 的 ID。您正在打印Subclass实例的 ID,因为您打印了id(self) -
您正在使用一个过于简单的心理模型来说明 Python 方法和属性的工作原理。
super().__init__()的意思是“查找__init__的任何super()返回的属性,以及属性查找返回的任何对象,可以是任何东西,调用它”。super实现与大多数类型不同的属性查找。
标签: python python-3.x inheritance