创建两组具有不同继承的类

Posted

技术标签:

【中文标题】创建两组具有不同继承的类【英文标题】:Create two sets of classes with different inheritance 【发布时间】:2022-01-10 14:51:25 【问题描述】:

我有一个基类Foo 和另一个基类Bar

我想创建两组Baz 类(例如Baz1, ..., Baz20),这样对于从1 到20 的每个N,都有一个继承自FooBazN 类,还有一个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 问题... 一个用例是如果父母FooBar是两个不同的数据库基类并且每个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/… 它们的细微差别在于它们不是动态命名类或超越父类,但它们确实提供了一些动态类生成的其他示例。

以上是关于创建两组具有不同继承的类的主要内容,如果未能解决你的问题,请参考以下文章

具有不同更新计划的事实表

创建具有不同参数长度的类

C ++如何从具有不同返回类型的接口多重继承?

从基本 asp.net 身份用户创建继承用户或为每个角色实现不同的接口? [关闭]

具有不同模板类型的子类的多态性

如何从 Flutter 中的不同模型继承多个类