2013-07-25 5 views
0

Я знаю, что я просто пропустил что-то простое здесь. Я просмотрел другие ответы, но не смог найти эту проблему.Вызов метода из класса в Python

>>> class Ben: 
...  """Can access variable but not method""" 
...  i = 320894 
...  def foo(self): 
...    return i 
... 
>>> Ben.i 
320894 
>>> Ben.foo(self) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
NameError: name 'self' is not defined 
+6

Вы должны прочитать [учебник Python] (http://docs.python.org/tutorial/) в познакомьтесь с основами классов в Python. – BrenBarn

ответ

4

Вы не прошли self самостоятельно. Это ссылка на экземпляр класса, на котором вы вызываете этот метод. Таким образом, вам нужно будет создать экземпляр Ben и вызывать этот метод на этом экземпляре:

ben = Ben() 
ben.foo() 

И вместо:

return i 

вам нужно использовать:

return self.i 
+0

Следует отметить, что атрибут класса 'i' возвращается только потому, что атрибут экземпляра' i' не существует в примере OP. Если вы хотите однозначно иметь значение класса 'i', вы должны использовать' return self .__ class __. I', иначе значение экземпляра возвращается, если оно существует. –

3

Вам необходимо создать экземпляр класса в этом случае и вызывать метод из этого.

>>> class Ben: 
    """Can access variable but not method""" 
    i = 320894 
    def foo(self): 
     return self.i 

>>> a = Ben() 
>>> a.foo() 
320894 

P.S - Вы не проходите self в качестве аргумента, и вы должны изменить оператор возврата к self.i.

3

Сначала необходимо создать экземпляр класса. «self» автоматически добавляется в качестве первого параметра, вы не можете передать его себе.

ben = Ben() 
ben.foo() 
1

Вот как я могу придумать (не в верхней части головы), чтобы получить атрибут класса из метода экземпляра:

class Ben: 
    i = 320894 
    def foo(self): 
     return self.i, self.__class__.i, Ben.i, Ben.__dict__['i'], getattr(Ben,'i') 

print Ben().foo() 

Печать:

(320894, 320894, 320894, 320894, 320894) 

Обратите внимание на Ben().foo() против Ben.foo(self) - Вам нужен экземпляр Бен перед вызовом foo и self подразумевается в призвании foo как метод этого экземпляра. Если у вас есть Ben().foo() экземпляр создается аналогично b=Ben() и затем вызвать b.foo()

self.i или Ben.i является наиболее простым. Имейте в виду, что это могут быть разные. self.i является атрибутом экземпляра и Ben.i является атрибутом класса:

class Ben(object): 
    i = 'class i' 

    def __init__(self): 
     self.i='instance i' 

    def foo(self): 
     return ('Instance i:',self.i, getattr(self,'i'), self.__dict__['i'], 
       'Class i:',self.__class__.i, getattr(Ben,'i'), Ben.i, Ben.__dict__['i']) 

print Ben().foo() 

Печать:

('Instance i:', 'instance i', 'instance i', 'instance i', 
'Class i:', 'class i', 'class i', 'class i', 'class i') 
+0

Это обходит реальную проблему OP, которая не понимает необходимость создания экземпляра (и это 'self' было неявным аргументом, переданным методу при вызове экземпляра). – chepner

+0

Я понимаю это. Поскольку у него было три ответа, которые заявили то же самое, я думал, что отправлю ответ, который фактически показал разницу между атрибутом класса и атрибутом экземпляра с тем же именем. – dawg

+0

@chepner: Я добавил вам полезные комментарии к тексту. Благодаря! – dawg

Смежные вопросы