2013-07-11 69 views
3

代碼:

class C: 
    def __init__(self, **kwargs): 
     self.w = 'foo' 
     self.z = kwargs['z'] 
     self.my_function(self.z)  
    def my_function(self, inp): 
     inp += '!!!' 

input_args = {} 
input_args['z'] = 'bar' 
c = C(**input_args) 
print c.z 

預期結果

bar!!! 

實際結果

bar 

你怎麼稱呼在初始化一個類的方法?如何在__init__中調用類的方法?

回答

5

修改self.z,不inp

def my_function(self, inp): 
    self.z += '!!!' 

其次字符串在Python不變的,所以修改inp不會影響原來的字符串對象。

見時self.z是可變的對象會發生什麼:

class C: 
    def __init__(self,): 
     self.z = [] 
     self.my_function(self.z)  
    def my_function(self, inp): 
     inp += '!!!' 
     print inp 
     print self.z 

C()   

輸出:

['!', '!', '!'] 
['!', '!', '!'] 
+0

啊!所以這是我的例子的問題!在我現實世界的問題中,我會做作文。謝謝。 –

-1

您正確調用類的方法,但是參數是按值傳遞,而不是參考。如果您在方法my_function修改inp,它不反映在self.z

+0

@downvoter你能解釋爲什麼你低估了我的答案嗎? – Pit

+1

不降價。但是在python中,參數是通過引用傳遞的。問題在於,當對字符串或數字執行「+ =」操作時,引用會發生更改(但列表不會)。 – neuront

+0

這不是一個類方法。 – 2rs2ts

0

您的代碼不包含任何classmethods。

你其實叫你所呼叫的實例方法,它只是沒有做任何其他比返回None

此外,如果這是Python 2.7版,一般事情會更好,如果你從object(或其他類)繼承。

4

的問題是,你實際上並沒有修改的self.z

值試試這個

class C: 
    def __init__(self, **kwargs): 
     self.w = 'foo' 
     self.z = kwargs['z'] 
     self.z = self.my_function(self.z)  

    def my_function(self, inp): 
     inp += '!!!' 
     return inp 

input_args = {} 
input_args['z'] = 'bar' 
c = C(**input_args) 
print c.z 
相關問題