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

时间:2015-02-21 02:49:24

标签: python class python-3.4 super

我看到了一个关于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的abilites,但我们已经可以使用这些能力了。那么我们为什么需要super()

2 个答案:

答案 0 :(得分:2)

因为你使用了错误的例子。尝试在没有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()是否存在。

答案 1 :(得分:1)

你在这里所做的就是作品,虽然你错过了一点点。

对于大型代码库,它通常被认为是一种更好的方法,因为它可以缓解调试问题。想象一下,你有一个继承了一个继承了类的类的类......过了一段时间它往往难以跟上。合成的正确例子是:

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)

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

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