关于传递论证与改变状态

时间:2015-08-21 14:44:37

标签: python oop

假设我有两个类AB,这两个类都需要维护相当复杂的内部状态,并且行为会随着命令行参数的变化而变化:

           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)由于类AB都需要访问命令行选项以及其他开关,所以现在有一个全局G:

 class G:
      self.opt1 = True
      self.opt2 = False
      ...

基本上维持共享状态并且可供所有利益方访问?这是一个可以接受的设计还是令人不悦的东西? TIA

1 个答案:

答案 0 :(得分:0)

  1. 您可以编写使用kwargs的初始值设定项。这样,您可以在初始化程序中设置任意数量的属性。 This post可能有所帮助。我认为这取决于您是否总是希望在实例化它们时设置AB的所有属性。您始终要设置的属性可以作为初始化程序的参数,以强制您实际设置它们。但是如果有时候你只设置了属性(比如某种带有默认值的可选标志),那么设置它们可能更有意义,可以在实例化对象后直接设置它们。

  2. 我认为这是一个非常好的解决方案。将全局选项放在一个对象中,而不是将它们作为全局变量放在一起当然更好。另一种选择是将全局选项作为初始化程序的一部分传递给AB,因此只有实例化AB的程序部分才需要直接了解全球国家。之后,AB将拥有要检查的本地属性。如果您希望全局状态发生变化,这种方法就不如您的G类。我认为我这样做的方法是创建G的全局状态选项static properties,这样您就不需要传递G的任何实例,只需访问通过班级的属性

  3. 我认为这些是很好的设计问题,你已经确定了一些关键的权衡。随意不同意我:)