2016-04-22 54 views
3

主要的文件,目的是運行所有東西,現在是十幾個變量(在頂層控制流中默認是全局的),一對結構和一箇中間大小的主循環。從其他語言中我瞭解到全局變量是邪惡的。我傾向於把它所有到一個類在同一個文件並調用只有一個方法,從全局控制流程類似以下內容:在python中設計一個程序入口點

def MyClass: 
    def __init__(self): 
    self.value1 = 1 
    .... 

if __name__ == "__main__": 
    #inspect sys.argv here 
    MyClass().main_proc() 

你會認爲這是一個設計加?有沒有pythonic的方式來做到這一點?

+0

我建議在https://programmers.stackexchange.com/上提問,但總的來說,我不知道該技術的任何特定問題。 – cxw

+2

Python不會強迫你使用OOP,如Java或C#,所以如果沒有真正的好處,你不需要將東西放入類中。尤其是創建一個類實例來組合東西不是最好的方式去恕我直言。您可以將這些東西提取到模塊中,而不需要任何實例,只需要導入即可。這樣它也在一個分離的文件和命名空間中。 –

+1

另外,'if __name__ ...'行的縮進是錯誤的,它必須位於外層。可能只是一個錯字? –

回答

2

Python不會強迫你使用OOP,如Java或C#,所以如果沒有真正的好處,你不需要將東西放入類中。

特別是創建一個類實例只是爲了分組東西不是最好的方式去恕我直言。您可以將這些東西提取到模塊中。這不需要任何實例,只需要導入。這樣它也在一個分離的文件和命名空間中。

例子:

main.py

if __name__ == "__main__": 
    import sys 
    args = sys.argv[1:] 
    if len(args) != 2: 
     print("This script requires exactly two command-line arguments!") 
     exit(1) 

    import my_module 
    exit_code = my_module.run(args) or 0 
    exit(exit_code) 
else: 
    raise ImportError("Run this file directly, don't import it!") 

my_module.py

# initialization code to be run at import time goes here 

def run(args): 
    # do whatever you need to do 
    print("Hello world!") 
    print("You said <", args[0], "> and <", args[1], ">." 

    # you may return an integer (1-255) as exit code if an error occurred, 
    # else the default exit code is 0 (successful; no error) 

然而,不採取這種方法,因爲終極的真理!這是我個人的(不那麼)卑微的意見,但總有一些情況下一種方法更適合,另一些方法更適合其他方面。

此外這主要是一個設計問題,並沒有真正影響到您的程序的穩定性或功能。它可能只會提高可讀性,但特別是對於小腳本來說,這不是一個好方法,因爲它增加了許多沒有任何實際操作的代碼。如果你有一個包含多個模塊的大型項目,我會說這很有用。

對於相當小的腳本(單個文件或只有很少的模塊),我建議您只需在頂部定義所需的所有類和函數,然後使用標準if __name__ == "__main__"作爲入口點。

+0

感謝您的澄清。關注主要不是關於分組,而是關於訪問。你的建議會帶來更多的潛在誤用,我的意思是這個單獨的模塊最終可能會被某個人導入,在最糟的情況下,這可能會通過全局變量產生一些細微但有害的交互。在C++之後,感覺像擁有模塊範圍的變量,任何模塊用戶都可以訪問它們並不安全。但可能我錯了,這裏的情況有所不同。 – VladimirLenin

+1

好吧,Python中根本沒有真正的訪問保護。您只通過以單個下劃線開始名稱來告訴其他程序員不要使用特定屬性,例如'_internal_variable'。如果你用雙下劃線開始名稱(除了以雙下劃線結尾的魔術方法),該屬性變成「私有」,但實際上Python只是執行名稱修改,並通過在此之前添加模塊來更改名稱。通過Python的偉大內省功能,如果您知道要尋找什麼,您幾乎可以獲得每個屬性。 –