我看到了一个关于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()
?
答案 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