有条件的python类继承

问题描述

我有一些类继承。

class A1:
    def __init__(self,b):
        self.b = b

    def some_A_function():
        print("This is A1 function")

    # ... more A1 specific functions

class B(A1):
    def __init__(self,a,b):
        super().__init__(b)
        self.a = a

    # ... more B specific functions

class C(B):
    def __init__(self,b)
        super().__init__(a,b)
    # ... more C specific functions

if __name__ == "__main__":
    # Main instance
    a = 1
    b = 2
    C_obj = C(a,b)

现在对A2类做一些介绍:

class A2:
    def __init__(self,b):
        self.b = b

    def some_A_function():
        print("This is A2 function")

现在,根据创建类 a 的实例时传递的 C 的值,预计类 B 的继承会发生变化。例如,如果 a=1B 继承 class A1 否则它继承 class A2

我不希望将任何代码更改为 class A1A2Cmain 块,因为它周围有大量代码实际上很难以任何方式对其进行重组。但是,我可以根据 a 的值来实现逻辑,通过更改 B 中的某些内容调用某个独立函数来决定 B 的继承。

一般来说,我是工厂函数的新手。我在搜索中找到的大多数示例都是在层次结构的最顶层实现的,它们评估条件并返回类的相关实现(类似于 if a==1,return C1 else {{1 }} 但是,就我而言,我不知道如何对 class C2 (在 C 函数中)要求 class main 继承 { 的两个实现之一{1}}(即 BA)基于作为变量 A1 传递的值。

解决方法

我猜这不是最干净的解决方案,但可以通过这种方式实现:

class A1:
    def __init__(self,b):
        self.b = b
    def some_A_function(self):
        print("This is A1 function","b = " + str(self.b))

class A2:
    def __init__(self,b):
        self.b = b
    def some_A_function(self):
        print("This is A2 function","b = " + str(self.b))

def get_class_B(base):
    class B(base):
        def __init__(self,a,b):
            super().__init__(b)
            self.a = a
    return B

def create_obj_C(a,b):
    if (a == 1): base = get_class_B(A1)
    elif (a == 2): base = get_class_B(A2)

    class C(base):
        def __init__(self,b):
            super().__init__(a,b)

    return C(a,b)

然后您必须通过辅助方法 C 创建 create_obj_C

create_obj_C(1,2).some_A_function() # "This is A1 function,b = 2"
create_obj_C(2,8).some_A_function() # "This is A2 function,b = 8"

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...