gpt4 book ai didi

python - 如果存在则调用 Python 方法

转载 作者:太空宇宙 更新时间:2023-11-03 14:44:36 26 4
gpt4 key购买 nike

仅当子类支持该方法时,如何从基类方法调用子类方法?最好的方法是什么?举个例子,我有一只保护我家的动物:如果有人经过它会看起来很生气,如果可以的话它会吠叫。

示例代码:

class Protector(object):
def protect(self):
self.lookangry()
if hasattr(self, 'bark'):
self.bark()

class GermanShepherd(Protector):
def lookangry(self):
print u') _ _ __/°°¬'
def bark(self):
print 'wau wau'

class ScaryCat(Protector):
def lookangry(self):
print '=^..^='

我可以为此想到很多替代实现:

  1. 如上所述使用 hasattr
  2. try: self.bark() except AttributeError: pass 但这也捕获了 bark
  3. 中的任何 AttributeErrors
  4. 与 2 相同,但检查错误消息以确保它是正确的 AttributeError
  5. 与 2 类似,但定义一个抽象的 bark 方法,该方法在抽象类中引发 NotImplementedError 并检查 NotImplementedError 而不是 AttributeError。使用此解决方案,Pylint 会提示我忘记重写 ScaryCat 中的抽象方法。
  6. 在抽象类中定义一个空的bark方法:

    class Protector(object):
    def protect(self):
    self.lookangry()
    self.bark()
    def bark(self):
    pass

我认为在 Python 中它们通常应该是做某事的一种方式。在这种情况下,我不清楚是哪个。这些选项中的哪一个最易读,最不可能在内容更改时引入错误并且最符合编码标准,尤其是 Pylint?有没有我错过的更好的方法?

最佳答案

在我看来,您对继承的思考不正确。基类应该封装在任何子类之间共享的所有内容。如果某些东西不被所有子类共享,根据定义它不是基类的一部分。

所以你的说法“如果有人走过它会看起来很生气,如果可以的话它会吠叫”对我来说没有意义。 “如果可以就叫”部分不会在所有子类之间共享,因此不应在基类中实现。

应该发生的事情是您要调用的子类添加此功能到protect() 方法。如:

class Protector():
def protect(self):
self.lookangry()

class GermanShepherd(Protector):
def protect(self):
super().protect() # or super(GermanShepherd, self).protect() for Python 2
self.bark()

这样所有的子类都会lookangry(),但是实现bark()方法的子类会把它作为父类(super class)的扩展功能的一部分>protect() 方法。

关于python - 如果存在则调用 Python 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50690286/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com