2015-06-09 100 views
1

我有一個類應該是這個類的一個實例。我不能在聲明行創建一個實例,因爲python解釋器不知道如何在那個時候構造對象。有一種可能的解決方法:在類聲明後進行初始化。python中的類變量初始化

class A(object): 
    static_variable = None 

    def some_method(self, a=static_variable): 
     print a 

A.static_variable = A() 

但我需要使用該類變量作爲默認參數。這樣可以解決這個問題:

def some_method(self, a=None): 
    a = a if a else A.static_variable 
    print a 

但是,它看起來對我來說非常不合理。任何關於如何使用這種靜態變量作爲默認參數的建議將不勝感激。

+2

使用'param = None'然後測試'如果parem是None'絕對是pythonic。 –

+2

爲什麼實例需要成爲該類的一個變量?爲什麼不直接在模塊級別定義它? –

+0

@DanielRoseman是的,我可以在模塊級別定義它,但仍不能解決默認參數的問題。 – midas

回答

0

Python不支持「靜態」變量,就像C++這樣的語言。所以在這種情況下,'static_variable'實際上是一個類變量,這就是爲什麼你遇到這個問題。我相信你已經知道這一點,但其他人可能有一天在這裏絆倒,並看到我們把它稱爲一個靜態變量,所以我們應該明白這一點爲後人。

我在想,因爲'static_variable'仍然是類A的成員,那麼也許有一種解決辦法,根本不用它作爲參數。

你可以在some_method()中使用關鍵字參數嗎?

而不是將它用作函數的默認參數,如果未使用kwarg,則可以只調用變量'A.static_variable'。

class A(object): 
    static_variable = None 

    def some_method(self, *, a=None): 
     if a: 
      print(a) 
     else: 
      print(A.static_variable) 

A.static_variable = A()