将一个较大的Python类重构为具有共享全局值的较小类



我通常会像下面这样写一个简单的类。初始化__init__中的python列表,并从不同的方法收集结果。

class my_class:
def __init__(self, res = []):
self.res = res

def method_1(self):
self.res.append('a')

def method_2(self):
self.res.append('b')

obj = my_class()
obj.method_1()
obj.res
obj.method_2()
obj.res

然而,方法的数量增长得非常快,我希望把它分解成更小的类。我不确定这是否可以用类继承来完成,见下文。我的目标是拥有一个全局self.res,它记录各种方法调用的结果,并且可以跨较小的类访问。

class my_class:
def __init__(self, res = []):
self.res = res
class my_class_1(my_calss):
def __init__(self, res):
super().__init__(res) 

def method_1(self):
self.res.append('a')
class my_class_2(my_class):    
def __init__(self, res):
super().__init__(res) 

def method_2(self):
self.res.append('b')

(更新):问题的背景:我正在建立一个包含不同选项卡的网页;对于每个选项卡,它包含图形和表格。我决定为每个选项卡创建单独的类,而不是使用一个类,因为它会快速增加行数。但是,我想维护一个字典,它收集类中的所有图和表,这样我就可以应用逻辑从触发器从另一个表更新图(表和图可以位于不同的选项卡)。我不确定什么是最好的类结构。

使用type动态创建类并将其存储在字典中。下面是一个基本的例子:

...
# list of methods, assumed they exists in the base class
methods = ['method_1', 'method_2']
# dynamically create (sub)classes
constructor = lambda self, lst: super(type(self), self).__init__(lst)
new_classes = {}
for i, m_name in enumerate(methods, 1):
d = {'__init__': constructor}
new_classes[f'my_class_{i}'] = type(f'my_class_{i}', (my_class,), d)
# test:
print(issubclass(new_classes['my_class_2'], my_class))
# True
c2 = new_classes['my_class_2']([1, 2])
c2.method_2()
print(c2.res)
#[1, 2, 'b']

注意:子类中的方法声明是多余的…如果与基类

中的相同,则省略它们。

最新更新