在同一方法中使用两个父方法

2024-05-16 02:03:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个类叫做电子人,它继承了另外两个类:人类机器人。 假设两个父母有自己的方法Talk(),我能从半机械人孩子那里调用这两种方法吗?例如:

class Cyborg(Human, Robot):
    def Talk(self):
        human_properties = Human.Talk()
        robot_properties = Robot.Talk()
        return human_properties + robot_properties

super()方法不能解决这个问题。你知道吗


Tags: 方法电子机器人robot孩子properties人类class
3条回答

与其将Talk视为方法,不如将其实现为classmethod,这样就不需要首先继承:

class Human:
   @classmethod
   def Talk(cls, *args):
      return 

class Robot:
  @classmethod
   def Talk(cls, *args):
      return

class Cyborg:
  def Talk(self):
     return Human.Talk() + Robot.Talk()

如果正确实现继承图,可以使用super实现。为了让它工作,HumanRobot都需要一个可以Talk的公共基类。你知道吗

class Thing:
    def Talk(self):
        # Things don't talk, but some more complex things may
        return ''

class Robot(Thing):
    def Talk(self):
        return 'I am a computer!\n' + super().Talk()

class Human(Thing):
    def Talk(self):
        return 'I am an organic being!\n' + super().Talk()

class Cyborg(Human, Robot):
    def Talk(self):
        return super().Talk()

这是一个谈话的例子。你知道吗

>>> Cyborg().Talk()
I am an organic being!
I am a computer!

>>> Robot().Talk()
I am a computer!

>>> Human().Talk()
I am an organic being!

使用super()您将在MRO链上拾取第一个同名的方法,但不能同时拾取这两个方法(除非拾取的方法自己调用super())。如果您想选择它们,您必须手动调用它们并显式传递self引用:

class Cyborg(Human, Robot):
    def Talk(self):
        human_properties = Human.Talk(self)
        robot_properties = Robot.Talk(self)
        return human_properties + robot_properties

不管怎样,我还是建议不要使用多重继承——虽然它既漂亮又有用,而且在非常罕见的情况下是不可替代的,但它有很多缺陷,处理它是不值得的。。。你知道吗

相关问题 更多 >