2011-11-15 52 views
22

我想一個默認的參數傳遞給使用實例的屬性值的實例方法:如何將實例成員的默認參數值傳遞給方法?

class C: 
    def __init__(self, format): 
     self.format = format 

    def process(self, formatting=self.format): 
     print(formatting) 

在嘗試,我得到了以下錯誤消息:

NameError: name 'self' is not defined 

我想該方法表現如下:

C("abc").process()  # prints "abc" 
C("abc").process("xyz") # prints "xyz" 

這裏有什麼問題,爲什麼這不起作用?我怎麼能做這個工作?

+0

不使用格式作爲變量名,因爲它是python中的內置函數。 – Yajushi

+0

在'process method'中編輯'self'的錯誤 –

回答

31

您無法真正將此定義爲默認值,因爲在任何實例存在之前定義方法時會計算默認值。一個簡單的解決辦法是做這樣的事情:

class C: 
    def __init__(self, format): 
     self.format = format 

    def process(self, formatting=None): 
     formatting = formatting if formatting is not None else self.format 
     print(formatting) 

self.format如果formattingNone纔會被使用。


爲了演示的默認值是如何工作的點,看到這個例子:

def mk_default(): 
    print("mk_default has been called!") 

def myfun(foo=mk_default()): 
    print("myfun has been called.") 

print("about to test functions") 
myfun("testing") 
myfun("testing again") 

和輸出這裏:

mk_default has been called! 
about to test functions 
myfun has been called. 
myfun has been called. 

通知mk_default如何被調用一次,而且在函數被調用之前發生了!

+0

我相信'mk_default'是在函數被調用之前調用的,因爲'foo = mk_default()'調用它,因爲括號。它不應該是'foo = mk_default'嗎?那麼你的例子可能會變成'myfun(「testing」)',接着是'myfun()'。 – gary

+0

這仍然是推薦的解決方法嗎? – confused00

+2

注意'formatting = formatting or self.format'''如果'formatting'是'false',那麼'formatting'會設置爲'self.format',比如0.這只是咬我。如果格式化不是None其他self.format或類似格式,則更安全的方法是輸入'formatting =格式。 – Godsmith

6

在Python中,名稱self而不是特殊。這只是參數名稱的約定,這就是爲什麼__init__中有self參數。 (實際上,__init__是不是很特別或者,尤其是它實際創建的對象......這是一個較長的故事)

C("abc").process()創建一個C情況下,查process方法在C類,並以C實例作爲第一個參數調用該方法。因此,如果您提供了參數,它將在self參數中結束。

即使你有這個參數,但是你不會寫def process(self, formatting = self.formatting)之類的東西,因爲self在你設置默認值的時候還沒有在範圍之內。在Python中,參數的默認值是在編譯函數時計算出來的,並且被「卡住」到函數中。 (這是相同的原因,如果你使用像[]默認情況下,該列表會記得函數調用之間的變化。)

我如何才能讓這項工作?

傳統的方法是使用None作爲默認,並檢查該值並取代它的功能裏面。您可能會發現爲此目的設定一個特殊的值會更安全一些(只要您隱藏它就可以使用object實例,以便調用代碼不使用相同的實例)而不是None。無論哪種方式,你應該檢查這個值與is,而不是==

+0

您的解決方法不符合使用無的所需輸出。 –

+0

如果'None'對於'formatting'是一個有效的值,那麼你將不得不選擇其他的東西,就像我解釋的那樣。 –

1

如果您希望它們表現爲非靜態方法,那麼需要將「self」作爲第一個參數傳遞給任何類函數。

它指的是對象本身。您無法將「self」作爲默認參數傳遞,因爲它的位置已被固定爲第一個參數。

在你的情況,而不是「格式化= self.format」使用「格式=無」,然後從分配如下代碼值:

[編輯]

class c: 
     def __init__(self, cformat): 
      self.cformat = cformat 

     def process(self, formatting=None): 
      print "Formating---",formatting 
      if formatting == None: 
       formatting = self.cformat 
       print formatting 
       return formatting 
      else: 
       print formatting 
       return formatting 

c("abc").process()   # prints "abc" 
c("abc").process("xyz")  # prints "xyz" 

注:請不要使用「格式」作爲變量名,因爲它是python中的內置函數

+0

那麼,我糾正了「自我」問題。但是你的答案不符合預期的輸出。 –

+0

檢查編輯的塊,它會幫助你。 – Yajushi

相關問題