2011-06-03 77 views
3

我試着寫類似引用自己的類:默認變量在python

class MyClass(object): 
    @staticmethod 
    def test(x, y, z=None): 
     if not z: 
      z = external_function(MyClass) 

是否有可能在python把它改寫成類似:

class MyClass(object): 
    @staticmethod 
    def test(x, y, z=external_function(MyClass)): 
     pass 

(第二代碼做不起作用,因爲它引用的MyClass在這一點上沒有定義)

+1

類方法必須將實例變量(object)'self'作爲它們的第一個變量。 99%的時間,你沒有將類傳遞給外部函數,而是將實例變量(或對象)'self'傳遞給外部函數。整個班級你正在做什麼,看起來不正確。你想寫一個'@ classfunction'嗎?還是你想操縱這個類的一個對象? – 2011-06-03 10:11:05

+0

它實際上是'@ staticmethod'。 – 2011-06-03 10:19:20

+1

不解決你的問題,但你應該真的使'test'成爲一個* class *方法,它將'cls'作爲第一個參數,然後在調用'external_function'時使用它。 – 2011-06-03 10:48:28

回答

3

這是不可能重寫代碼的方式。最近你可以做的是這樣的:

class MyClass: 
     pass 

def test(x, y, z=external_function(MyClass): 
     pass 

MyClass.test = staticmethod(test) 
del test 

請注意,這假定Python 3;在Python 2中,您可能需要擺弄new模塊。但儘管這是可能的,但代碼的意圖是非常不明顯的。最好堅持if z is None,或者重構你的代碼不需要這個。

+0

不幸的是它是Python 2(2.5或2.6) – 2011-06-03 10:47:38

3

這是不可能的,因爲無論在任何方法的參數定義中,無論是靜態方法還是普通方法,都是par sed並在類創建時執行,然後創建您嘗試使用的類對象。如下面的代碼所示,默認值也在這個時候被評估。

def say_hi(): 
    print "Getting default value" 

class MyClass(object): 
    print "Creating class" 
    @staticmethod 
    def test(a=say_hi()): 
     print "test called" 

MyClass.test() 
MyClass.test() 

輸出:

 
Creating class 
Getting default value 
test called 
test called 
+0

我知道;)我正在尋求解決方法。 – 2011-06-03 10:52:30