问题描述
我有一些类继承。
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=1
,B
继承 class A1
否则它继承 class A2
。
我不希望将任何代码更改为 class A1
、A2
、C
和 main
块,因为它周围有大量代码实际上很难以任何方式对其进行重组。但是,我可以根据 a
的值来实现逻辑,通过更改 B
中的某些内容或调用某个独立函数来决定 B
的继承。
一般来说,我是工厂函数的新手。我在搜索中找到的大多数示例都是在层次结构的最顶层实现的,它们评估条件并返回类的相关实现(类似于 if a==1
,return C1
else {{1 }} 但是,就我而言,我不知道如何对 class C2
(在 C
函数中)要求 class main
继承 { 的两个实现之一{1}}(即 B
、A
)基于作为变量 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"