首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >调用函数B时,python函数A是如何执行的?

调用函数B时,python函数A是如何执行的?
EN

Stack Overflow用户
提问于 2022-10-17 08:26:17
回答 2查看 67关注 0票数 0

现行守则是:

代码语言:javascript
复制
class Base:
    def hello(self):
        print('hello')


class A(Base):
    def greet(self):
        self.hello()
        print('how are you?')


class B(Base):
    def greet(self):
        self.hello()
        print('how are you doing?')

当调用self.hello()时,我如何编写代码来实现这个调用self.greet(),而不是在每个A类和B类中添加self.hello()

我想遵循不要重复自己的原则。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-10-17 09:04:48

您有重复代码的原因是因为您正在重新定义代码中的“问候”。通过认识到greet总是由"hello“消息后面跟着一个问题组成,您可以在基类中实现该通用功能,并要求在子类中实现实际的问题。

这个简单示例的代码略多一点,但它演示了一般原则:

代码语言:javascript
复制
class Base:

    def hello(self):
        print('hello')

    def question(self):
        # this should be implemented in the derived classes
        raise NotImplementedError

    def greet(self):
        self.hello()
        self.question()


class A(Base):

    def question(self):
        print('how are you?')


class B(Base):

    def question(self):
        print('how are you doing?')


a = A()
b = B()
a.greet()
b.greet()

注意:没有来定义基类中的question()方法(您可以省略它,代码仍然可以工作),但是它有助于记录子类必须定义这个函数,并且它会打印一个更有用的错误消息,以防您意外地试图调用基类的对象上的question()方法。它还可以避免在运行指针(如pylintpycodestyle)时发出警告,并在使用IDE (如Visual )时改进语法突出显示/自动完成。

票数 2
EN

Stack Overflow用户

发布于 2022-10-17 08:56:46

在这个场景中,我认为您希望定义Base类中的基本行为,允许后续类通过添加额外的逻辑来扩展到该行为,而不是替换它。

以下是实现这一目标的一种方法:

代码语言:javascript
复制
class Base:
    def hello(self):
        print('hello')

    def greet(self):
        self.hello()


class A(Base):
    def greet(self):
        super().greet()
        print('how are you?')


class B(Base):
    def greet(self):
        super().greet()
        print('how are you doing?')

即使重复对super().greet()的调用,这也是在Python中进行调用的方法--因为需要显式调用它(例如,在Java中,父调用总是被调用的)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74094443

复制
相关文章

相似问题

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