派生类调用基类的方法主要有两种。
Base.method(self):
class Derived(Base):
def method(self):
Base.method(self)
...或super().method():
class Derived(Base):
def method(self):
super().method()
...假设我现在这样做:
obj = Derived()
obj.method()据我所知,Base.method(self)和super().method()都做同样的事情。两者都将使用对Base.method的引用来调用obj。特别是,super()不执行常规工作来实例化Base类型的对象。相反,它创建一个新的super类型的对象,并将实例属性从obj移植到它上,然后在尝试从超级对象获取它时,动态地从Base查找正确的属性。
super()方法的优点是将更改派生类的基时所需的工作量降到最低。另一方面,Base.method使用更少的魔力,当一个类从多个基类继承时,它可能更简单、更清晰。
我看到的大多数讨论都建议调用super(),但这是否是Python的既定标准?或者这两种方法都在实践中得到了广泛的应用?例如,这个堆叠溢出问题的答案是双向的,但是通常使用super()方法。另一方面,我从这学期开始教的Python教科书只显示了Base.method的方法。
发布于 2021-04-23 23:30:14
使用super()意味着不管它是什么,接下来的任何事情都应该委托给基类。是关于语句的语义的。另一方面,显式地引用Base传递了这样一种想法,即Base是出于某种原因(读者可能不知道)而显式选择的,这可能也有其应用。
除此之外,使用super()还有一个非常实际的原因,即协作多重继承。假设您设计了以下类层次结构:
class Base:
def test(self):
print('Base.test')
class Foo(Base):
def test(self):
print('Foo.test')
Base.test(self)
class Bar(Base):
def test(self):
print('Bar.test')
Base.test(self)现在,您可以同时使用Foo和Bar,一切都如预期的那样工作。但是,这两个类不能在多继承模式中一起工作:
class Test(Foo, Bar):
pass
Test().test()
# Output:
# Foo.test
# Base.test对test的最后一次调用跳过了Bar的实现,因为Foo没有指定它希望按照方法解析顺序委托给下一个类,而是显式指定了Base。
class Base:
def test(self):
print('Base.test')
class Foo(Base):
def test(self):
print('Foo.test')
super().test()
class Bar(Base):
def test(self):
print('Bar.test')
super().test()
class Test(Foo, Bar):
pass
Test().test()
# Output:
# Foo.test
# Bar.test
# Base.testhttps://stackoverflow.com/questions/67237473
复制相似问题