为什么在类没有指定超类时使用super().__ init __(* args,** kwargs)?

时间:2018-05-20 16:14:18

标签: python

我理解为什么当一个类是超类的子类时使用了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)

1 个答案:

答案 0 :(得分:8)

假设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__的{​​{1}}来电super().__init__(*args, **kwargs)
  • Sneaky.__init__的{​​{1}}来电Sneaky.__init__

如果从super().__init__(*args, **kwargs)移除Person.__init__来电,那么super().__init__会提出

Sneaky.__init__

因为t.human不会被调用。