无需定义类的多重继承

问题描述 投票:0回答:1

我不确定这是否可能,我想知道这是否是可行的方法,或者是否存在更好的方法。

我将创建一个玩具示例来展示我正在寻找的内容。

假设我有不同国籍的人。我正在为每个国籍创建一个类,这些类都有一个方法问候语。

class French:
  def greeting(self):
    print("Bonjour")

class English:
  def greeting(self):
    print("Hello")

class Spanish:
  def greeting(self):
    print("Hola")

当然,这可以通过使用单个类 Person 并在方法greeting中使用条件来完成,但我们可以想象函数greeting比这更复杂,并证明为每个国籍都有一个类是合理的。

您还可以想象所有这些民族实际上都是 Person 类的子类,并重写方法

greeting
来输出他们自己的语言。

现在,想象一下我的另一个功能,例如“运动”,然后我还为不同的运动创建不同的类别。

class Football:
  def sport(self):
    print("Football")

class Tennis:
  def sport(self):
    print("Tennis")

class Golf:
  def sport(self):
    print("Golf")

再一次,想象一下功能运动更复杂,而不是有一个单一的类 Sport,并且不同的类是合理的。或者我们可以想象所有这些类都是普通类 Sport 的子类,并覆盖方法 sport。

现在,我想要一个既继承国籍又继承体育运动的班级。这个类不会添加新的方法或属性,它只是继承自两个类,因此它有自己的greeting和sport。

我可以创建一个继承自 French 和 Football 的 FrenchFootball 类。

class FrenchFootball(French, Football):
  pass

我现在可以实例化这个类,它将有一个方法

greeting
和一个方法
sport

foo = FrenchFootball()
foo.greeting()   # Bonjour
foo.sport()      # Football

现在,问题是:

子类不需要添加任何属性或方法,它只是将国籍与运动联系起来,因此生成的实例显示“Bonjour”并且喜欢“足球”。

但是,为了创建这样的实例,我必须定义一个仅继承这两个类的类 FrenchFootball。

如果我想要这个玩具示例的所有组合,我需要定义 9 个子类,这样我就可以通过它们的名称实例化它们

问题:

有没有一种方法可以将 foo 实例化为 English Tennis,而无需编写 EnglishTennis 类的代码?

您可以想象,拥有 10 个运动项目和 20 个国籍会让创建这些子链接课程成为一场噩梦。

我想要类似(伪代码)的东西

foo = new Class(English, Tennis)

这基本上告诉 python:我想要一个继承 English 和 Tennis 的空类的实例,但我并没有真正编写 EnglishTennis 类。我在实例化类时定义继承。

python class inheritance multiple-inheritance
1个回答
0
投票

如果使用

class
语句,那么,正如您所观察到的,类必须被硬编码在源文件中。

但是,Python 允许动态创建类。只需调用内置的

type
,将类名作为第一个参数,基类作为第二个参数,命名空间(可能为空)作为第三个参数:

new_class = type("FrenchFootball", (French, Football), {})

[擦拭]

© www.soinside.com 2019 - 2024. All rights reserved.