假设我有两个类A
和B
,这两个类都需要维护相当复杂的内部状态,并且行为会随着命令行参数的变化而变化:
ARGS = [arg1, arg2, arg3]
/ \
/ \
class A: class B
def __init__(self, key1=arg1, key2=arg2 ...)
self.state1 = blah ...
self.state2 = blah ...
我有两个问题:
(1)我可以通过key=val
参数列表初始化具有不同行为的对象,但这个长列表很快就会变得笨拙。我也可以直接改变状态,我应该遵循哪些理由或规则?
(2)由于类A
和B
都需要访问命令行选项以及其他开关,所以现在有一个全局G:
class G:
self.opt1 = True
self.opt2 = False
...
基本上维持共享状态并且可供所有利益方访问?这是一个可以接受的设计还是令人不悦的东西? TIA
答案 0 :(得分:0)
您可以编写使用kwargs
的初始值设定项。这样,您可以在初始化程序中设置任意数量的属性。 This post可能有所帮助。我认为这取决于您是否总是希望在实例化它们时设置A
和B
的所有属性。您始终要设置的属性可以作为初始化程序的参数,以强制您实际设置它们。但是如果有时候你只设置了属性(比如某种带有默认值的可选标志),那么设置它们可能更有意义,可以在实例化对象后直接设置它们。
我认为这是一个非常好的解决方案。将全局选项放在一个对象中,而不是将它们作为全局变量放在一起当然更好。另一种选择是将全局选项作为初始化程序的一部分传递给A
和B
,因此只有实例化A
和B
的程序部分才需要直接了解全球国家。之后,A
和B
将拥有要检查的本地属性。如果您希望全局状态发生变化,这种方法就不如您的G
类。我认为我这样做的方法是创建G
的全局状态选项static properties,这样您就不需要传递G
的任何实例,只需访问通过班级的属性
我认为这些是很好的设计问题,你已经确定了一些关键的权衡。随意不同意我:)