创建两组具有不同继承的类
Posted
技术标签:
【中文标题】创建两组具有不同继承的类【英文标题】:Create two sets of classes with different inheritance 【发布时间】:2022-01-10 14:51:25 【问题描述】:我有一个基类Foo
和另一个基类Bar
。
我想创建两组Baz
类(例如Baz1, ..., Baz20
),这样对于从1 到20 的每个N
,都有一个继承自Foo
的BazN
类,还有一个BazN
继承自 Bar
的类。所以我最终会得到 40 个 BazN
类,其中 20 个是 BazNFoo
,其中 20 个是 BazNBar
类型。
我所拥有的是下面的 sn-p,它显式地将每个 BazN
类写入两次,一次从 Foo
继承,一次从 Bar
继承。我的问题是,是否有一种编程方式来编写每个BazN
课程一次?我的Baz
课程很长。
class Foo:
def __init__(self):
# code specific to Foo
class Bar:
def __init__(self):
# code specific to Bar
class Baz1Foo(Foo):
def __init__(self):
super().__init__()
# code specific to Baz1
class Baz1Bar(Bar):
def __init__(self):
super().__init__()
# code specific to Baz1
class Baz2Foo(Foo):
...
【问题讨论】:
注意:Foo 和 Bar 有不兼容的信息,所以我不能简单地使用多重继承(例如,class Baz1(Foo, Bar)
)
一个家长的20个孩子班级是一个非常奇怪的设计,他们会有什么不同的属性?这不是一个好主意,你不应该为此找到解决方案,而是完全不同的方式来做到这一点
我能问一下你为什么想要这样的设计吗?这看起来很像 X/Y 问题...
一个用例是如果父母Foo
和Bar
是两个不同的数据库基类并且每个Baz
是一个表模式。比如在sqlalchemy中,可以使用declarative_base
创建一个Base类,或者显式创建一个Base类。
另外,如果我的任意 N=20 提出了公然的设计问题,我们深表歉意,同样的问题仅适用于 N=2-3(大)子类,其中一个人宁愿不复制相同的子代码两次。
【参考方案1】:
您可以使用type
创建动态子类 - 但是这是相对先进的,仅仅因为它可以这样做,并不意味着这是一个好主意...
# Define a parent class
class Foo():
def __init__(self):
print("Init Foo")
def foo(self):
print("Method Foo")
# Create a dict to store the sub-classes in (could use globals() instead)
classes =
for i in range(2):
# Create Foo0..Foo2
classes[f'Fooi'] = type(
f'Fooi',
# Inherit from Foo
(Foo,),
# super() must be passed child class object in type construction
# https://bugs.python.org/issue29944
"__init__": lambda self: super(self.__class__, self).__init__()
)
# Some proof it works...
for cls in classes.values():
# Instantiate each class
i = cls()
# Print the class info (name)
print(i.__class__)
# Call the (inherited) foo method
i.foo()
### OUTPUT:
# Init Foo
# <class '__main__.Foo0'>
# Method Foo
# Init Foo
# <class '__main__.Foo1'>
# Method Foo
# Init Foo
# <class '__main__.Foo2'>
# Method Foo
【讨论】:
谢谢!看起来这里也涵盖了动态子类:***.com/questions/19438923/python-dynamic-subclassing***.com/questions/9269902/… 它们的细微差别在于它们不是动态命名类或超越父类,但它们确实提供了一些动态类生成的其他示例。以上是关于创建两组具有不同继承的类的主要内容,如果未能解决你的问题,请参考以下文章