我不确定这是否可能,我想知道这是否是可行的方法,或者是否存在更好的方法。
我将创建一个玩具示例来展示我正在寻找的内容。
假设我有不同国籍的人。我正在为每个国籍创建一个类,这些类都有一个方法问候语。
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 类。我在实例化类时定义继承。
如果使用
class
语句,那么,正如您所观察到的,类必须被硬编码在源文件中。
但是,Python 允许动态创建类。只需调用内置的
type
,将类名作为第一个参数,基类作为第二个参数,命名空间(可能为空)作为第三个参数:
new_class = type("FrenchFootball", (French, Football), {})
[擦拭]