为什么我们在继承已经足够的时候使用 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
我看到一个例子是关于 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