[英]What does 'super' do in Python? - difference between super().__init__() and explicit superclass __init__()
[英]What is the difference between having parameters within super and the init parentheses … super().__init__()
我知道super().__init__()
的概念與繼承有關,而且我已經看到init
帶有參數的代碼。 但是,我遇到了一個具有以下內容的代碼示例:
class Maze(tk.Tk, object):
def __init__(self):
super(Maze, self).__init__()
參數現在位於super
括號內。 有什么區別?為什么可以使用其中一個? 謝謝
這是super()
的原始工作方式:
super(Maze, self).__init__()
這也是它在Python 2中運行的唯一方式。
您要調用綁定到self
Maze
(可能是tk.Tk
)的超類的__init__()
。 為此,您必須將Maze
和self
參數傳遞給super
,以便它知道該怎么做。
它實際上是做什么的?
super(Maze, self).__init__
必須確定要從中提取MRO的type(self)
,即,類之間相互繼承的順序。
然后,在該列表中,找到位於Maze
上方的類,並在該類或上方的任何類中查找__init__
。 找到它后,它將__init__
init方法__init__
到self
(即修復了它的第一個參數,因此您不必傳遞它)。
您可以自己實現該版本的super
。 就像這樣:
class my_super:
def __init__(self, cls, obj):
self.cls = cls
self.obj = obj
def __getattribute__(self, method_name):
cls = object.__getattribute__(self, 'cls')
obj = object.__getattribute__(self, 'obj')
mro = type(obj).__mro__
mro_above_cls = mro[mro.index(cls)+1:]
for super_cls in mro_above_cls:
if hasattr(super_cls, method_name):
method = getattr(super_cls, method_name)
return functools.partial(method, self)
請注意,您根本不必從方法中調用此方法。 您可以這樣做:
class A:
def f(self):
print('A')
class B(A):
def f(self):
print('B')
a = A()
b = B()
super(B, b).f() # prints: A
my_super(B, b).f() # prints: A
super(Maze, self).__init__()
非常明確,但是幾乎所有的Python代碼都始終使用當前類和self作為參數,因此Python 3通過提供知道所需內容的魔術super()
使其變得更容易。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.