2013-07-25 47 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」在OP示例中不存在,所以返回「i」的類屬性。如果你想毫不含糊地使用'i'的類值,你應該使用'return self .__ class __。i',否則返回實例值(如果存在的話)。 – 2013-07-27 17:40:43

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作爲參數,你必須return語句改爲self.i

3

您首先必須創建該類的一個實例。 「自我」會自動添加爲第一個參數,您無法自行傳遞。

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() VS Ben.foo(self) - 你需要奔實例調用fooself之前是在foo調用作爲實例的方法隱含的。如果你有Ben().foo()同樣創建的實例b=Ben(),然後調用b.foo()

self.iBen.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

相關問題