簡體   English   中英

為什么在類沒有指定超類時使用super().__ init __(* args,** kwargs)?

[英]Why is super().__init__(*args,**kwargs) being used when class doesn't specify a superclass?

我理解為什么當一個類是超類的子類時使用了super(),但是什么是未指定子類參數中的超類的類的超類? 這是我的代碼:

import random


class Sneaky:
    sneaky = True

    def __init__(self, sneaky=True, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.sneaky = sneaky

    def hide(self, light_level):
        return self.sneaky and light_level < 10


class Agile:
    agile = True

    def __init__(self, agile=True, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.agile = agile

    def evade(self):
        return self.agile and random.randint(0, 1)

假設Sneaky用作多繼承類結構的一部分,例如:

class Sneaky:
    sneaky = True

    def __init__(self, sneaky=True, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.sneaky = sneaky

    def hide(self, light_level):
        return self.sneaky and light_level < 10

class Person:
    def __init__(self, human=True, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.human = human

class Thief(Sneaky, Person): 
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)


t = Thief()
print(t.human)
# True

以來

In [62]: Thief.mro()
Out[62]: [__main__.Thief, __main__.Sneaky, __main__.Person, object]
  • Thief.__init__super().__init__(*args, **kwargs)調用Sneaky.__init__
  • Sneaky.__init__super().__init__(*args, **kwargs)調用Person.__init__

如果從Sneaky.__init__中刪除了super().__init__調用,那么t.human會提升

AttributeError: 'Thief' object has no attribute 'human'

因為Person.__init__不會被調用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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