2011-08-08 22 views
3

調用函數,當我跑下面的代碼,通過調用函數的構造獲取NameError在構造

首先 - 我再次運行此,我得到這個

>>> class PrintName: 
... def __init__(self, value): 
...  self._value = value 
...  printName(self._value) 
... def printName(self, value): 
...  for c in value: 
...  print c 
... 
>>> o = PrintName('Chaitanya') 
C 
h 
a 
i 
t 
a 
n 
y 
a 

>>> class PrintName: 
... def __init__(self, value): 
...  self._value = value 
...  printName(self._value) 
... def printName(self, value): 
...  for c in value: 
...  print c 
... 
>>> o = PrintName('Hello') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 4, in __init__ 
NameError: global name 'printName' is not defined 

我不能在構造函數中調用函數嗎?並且在執行類似的代碼時會出現偏差?

注意:我忘了使用self(例如self.printName())調用該類的局部函數。爲帖子道歉。

回答

11

因爲你的函數是一個屬於PrintName類的方法,所以你需要調用self.printName。或者,由於您的printname函數不需要依賴對象狀態,因此您可以將其設置爲模塊級別的函數。

class PrintName: 
    def __init__(self, value): 
     self._value = value 
     printName(self._value) 

def printName(value): 
    for c in value: 
    print c 
1

而不是

printName(self._value) 

你想

self.printName(self._value) 

它可能工作的第一時間,因爲你必須在父範圍內的另一個功能printName

1

你想要的是self.printName(self._value)__init__,而不僅僅是printName(self._value)

1

我知道這是一個老問題,但我只是想補充一點,您還可以使用Class名稱和傳遞self作爲第一個參數來調用該函數。

不知道爲什麼你想要,但我認爲這可能會讓事情變得不那麼清晰。

class PrintName: 
    def __init__(self, value): 
     self._value = value 
     PrintName.printName(self, self._value) 

    def printName(self, value): 
     for c in value: 
     print(c) 

見章節蟒蛇手冊更多信息的9:

9.3.4. Method Objects

其實,你可能已經猜到了答案:方法的特別之處在於,對象是作爲傳遞函數的第一個參數。在我們的例子中,調用x.f()完全等同於MyClass.f(x)。一般情況下,調用帶有n個參數列表的方法等同於使用通過在第一個參數之前插入方法對象創建的參數列表來調用相應的函數。