2013-07-11 2 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 += '!!!' 

Во-вторых строки неизменны в питона, поэтому изменение 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

Вы правильно вызвать метод класса, однако параметры передаются по значению, а не по ссылке. Если вы изменили inp по методу my_function, он не отражается на self.z.

+0

@downvoter Не могли бы вы объяснить, почему вы отклонили мой ответ? – Pit

+1

Не опущен вниз. Но в параметрах python передаются по ссылке. Проблема в том, что ссылка изменяется, когда «+ =» соответствует строкам или номерам (но список не будет). – neuront

+0

Это не метод класса. – 2rs2ts

0

Ваш код не содержит каких-либо классных методов.

Фактически вы вызываете метод экземпляра, который вы вызываете, он просто ничего не делает, кроме возврата 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 
Смежные вопросы