簡體   English   中英

在super和init括號之間具有參數之間有什么區別…super().__ 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__() 為此,您必須將Mazeself參數傳遞給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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM