首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >调用超级().method()与BaseClass.method(self)

调用超级().method()与BaseClass.method(self)
EN

Stack Overflow用户
提问于 2021-04-23 22:22:45
回答 1查看 259关注 0票数 1

派生类调用基类的方法主要有两种。

Base.method(self):

代码语言:javascript
运行
复制
class Derived(Base):
    def method(self):
        Base.method(self)
        ...

super().method():

代码语言:javascript
运行
复制
class Derived(Base):
    def method(self):
        super().method()
        ...

假设我现在这样做:

代码语言:javascript
运行
复制
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的方法。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-23 23:30:14

使用super()意味着不管它是什么,接下来的任何事情都应该委托给基类。是关于语句的语义的。另一方面,显式地引用Base传递了这样一种想法,即Base是出于某种原因(读者可能不知道)而显式选择的,这可能也有其应用。

除此之外,使用super()还有一个非常实际的原因,即协作多重继承。假设您设计了以下类层次结构:

代码语言:javascript
运行
复制
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)

现在,您可以同时使用FooBar,一切都如预期的那样工作。但是,这两个类不能在多继承模式中一起工作:

代码语言:javascript
运行
复制
class Test(Foo, Bar):
    pass

Test().test()
# Output:
# Foo.test
# Base.test

test的最后一次调用跳过了Bar的实现,因为Foo没有指定它希望按照方法解析顺序委托给下一个类,而是显式指定了Base

代码语言:javascript
运行
复制
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.test
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67237473

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档