2015-08-21 54 views
1

比方說,我有兩個類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

回答

0
  1. 你可以編寫一個使用kwargs的初始值設定項。通過這種方式,您可以在初始化程序中設置儘可能多或最少的屬性。 This post可能會有所幫助。我認爲這取決於你是否總是希望將所有的AB的屬性,當你實例化它們。您始終想要設置的屬性可以作爲初始化程序的參數,以強制實際設置它們。但是如果有些屬性你只是有時候設置的(比如某種具有默認值的可選標誌),那麼在實例化對象後直接設置它們可能更有意義。

  2. 這是一個完美的解決方案OK,我認爲。將全局選項放在一個對象中當然更好,而不是將它們作爲全局變量。另一種選擇是傳給AB全局選項作爲初始化的一部分,實例化AB需要直接瞭解全局狀態的程序所以只有一部分。之後,AB將具有要檢查的本地屬性。如果您預計全球狀況發生變化,這種方法將不如您的G班。我認爲我會做到這一點的方法是使全局狀態選項G所以static properties,你不需要繞過的G任何情況下,可以通過只在類

我訪問屬性認爲這些都是很好的設計問題,並且您已經確定了一些重要的權衡。請隨時與我不同意:)