为什么我们在继承已经足够的时候使用 super()

Why we using super() when inherit is already enough

我看到一个例子是关于 super();

class Class1:
    def __init__(self):
        pass

    def name(self):
        return "My name is"


class Class2(Class1):
    def __init__(self):
        pass

    def name(self):
        return super(Class2, self).name() + " Tom"

#now lets call the object.
b = Class2()
print(b.name())
#Output is 'My name is Tom'

这是我根据上述代码制作的没有 super() 的另一个版本;

class Class1:
    def __init__(self):
        pass

    def name(self):
        return "My name is"

a = Class1() 

class Class2(Class1):
    def __init__(self):
        pass

    def name(self):
        return a.name() + " Tom"

b = Class2()
print(b.name())

输出相同。因此,虽然我们可以从 Class1 继承能力,但我们已经可以使用这些能力了。那为什么我们需要 super() ?

因为你用错了例子。尝试在没有 super() 的情况下执行此操作:

class Base:
    def __init__(self, x):
        self.x = x

    def square(self):
        return self.x**2


class Derived(Base):
    def __init__(self, x, y):
        super().__init__(x)
        self.y = y

    def square(self):
        return super().square() + self.y**2


class CubeMixin(Base):
    def square(self):
        return self.x**3


class MultiplyDerived(Derived, CubeMixin):
    pass

已编辑 使用多重继承,根据评论中的 chepner。

Derived 调用 super().square() 时,它得到 CubeMixin.square(),而不是 Base.square()。如果它没有使用 super(),它甚至无法知道 CubeMixin.square() 的存在。

你在这里做的叫做合成,虽然你错过了一点。

对于大型代码库,它通常被认为是一种更好的方法,因为它减少了调试问题。想象一下,您有一个 class 继承了一个 class,而 class 又继承了一个 class... 一段时间后,它往往会变得难以跟上。正确的组合示例是:

class a(object):
    def __init__(self, a):
        self.a = a

class b(object):
    def __init__(self, b):
        self.b = b

class rect(object):
    def __init__(self, x, y):
        self.a = a(x)
        self.b = b(y)

这对于一些愚蠢的事情来说似乎有点愚蠢,但与继承的用途几乎相同。此外,可能需要更多代码(装饰器)才能使 class 实例的行为不像对象,这样您就不会打扰最终用户。

得到一个更好的例子,比较组合与继承Here