作者:kyf召世星bdc | 来源:互联网 | 2023-01-31 13:46
从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__ from SubClass.
self object id from SubClass: 140690611849200
__init__ from SuperClass.
self object id from SuperClass: 140690611849200
这意味着,在该线super().__init__()
,super()
正在返回其然后隐式地传递到父类的当前对象__init__()
的方法.这是准确的还是我错过了什么?
简单来说,我想了解以下内容:
什么时候super().__init__()
跑,
究竟是什么传递给了__init__()
怎么样?我们正在调用它,super()
所以无论返回什么,都应该__init__()
从我对Python的理解到目前为止传递给方法.
我们为什么不self
进入super().__init__()
?
Prune..
8
返回一个代理对象,该方法将方法调用委托给父类或兄弟类的类型.
这proxy
是一个充当父类的方法调用部分的对象.这不是班级本身; 相反,它只是足够的信息,因此您可以使用它来调用父类方法.
如果您打电话__init__()
,您将获得自己的本地子类__init__
功能.当您调用时super()
,您将获得该代理对象,该对象将重定向到父类方法.因此,当您调用时super().__init__()
,该代理会将调用重定向到父类__init__
方法.
同样,如果您要调用super().foo
,您将从foo
父类中获取该方法 - 再次由该代理重新路由.
你明白了吗?
对OP评论的回应
但这必须意味着在运行super()时将此代理对象传递给
init().init()对不对?
错误.代理对象就像包名,例如调用math.sqrt().你没有将数学传递给sqrt,你用它来表示你正在使用哪个sqrt.如果你想将代理传递给init,那么调用将是init(super()).当然,这种呼吁在语义上是荒谬的.
当我们必须实际传入self时,我的例子中是sc对象.
不,你没有进来sc
; 那就是结果对象创建呼叫(内部方法__new__
),其中包括的调用init
.因为__init__
,该self
对象是Python运行时系统为您创建的新项目.对于大多数类方法,第一个参数(在其他语言中称为self
约定this
)是调用该方法的对象.
1> Prune..:
返回一个代理对象,该方法将方法调用委托给父类或兄弟类的类型.
这proxy
是一个充当父类的方法调用部分的对象.这不是班级本身; 相反,它只是足够的信息,因此您可以使用它来调用父类方法.
如果您打电话__init__()
,您将获得自己的本地子类__init__
功能.当您调用时super()
,您将获得该代理对象,该对象将重定向到父类方法.因此,当您调用时super().__init__()
,该代理会将调用重定向到父类__init__
方法.
同样,如果您要调用super().foo
,您将从foo
父类中获取该方法 - 再次由该代理重新路由.
你明白了吗?
对OP评论的回应
但这必须意味着在运行super()时将此代理对象传递给
init().init()对不对?
错误.代理对象就像包名,例如调用math.sqrt().你没有将数学传递给sqrt,你用它来表示你正在使用哪个sqrt.如果你想将代理传递给init,那么调用将是init(super()).当然,这种呼吁在语义上是荒谬的.
当我们必须实际传入self时,我的例子中是sc对象.
不,你没有进来sc
; 那就是结果对象创建呼叫(内部方法__new__
),其中包括的调用init
.因为__init__
,该self
对象是Python运行时系统为您创建的新项目.对于大多数类方法,第一个参数(在其他语言中称为self
约定this
)是调用该方法的对象.