2013-04-30 75 views
3

我是Python新手,正在研究存儲有關書籍的有意義數據段的類。我已經開始如下:從類__init__方法調用函數時未定義Python全局名稱

class BookDisplay: 

    def __init__(self, _name, _isbn, _price, _picture, _link): 
     self.name = _name 
     self.isbn = _isbn 
     self.price = _price 
     self.picture = _picture 
     self.link = _link 
     self.xmlString = MakeXMLString(_name, _isbn, _price, _picture, _link)      

    name = "" 
    isbn = "" 
    price = 0.0 
    picture = "" #a URL 
    link = "" 

    xmlString = "" 

我認爲這__init__方法將只能夠調用MakeXMLString,這是我在同一個文件(bookdisplay.py)定義,正下方BookDisplay類:

def MakeXMLString(_name, _isbn, _price, _picture, _link): #python multi-line syntax 
    xmlString = "<name>" + _name + "</name>" \ 
        + "<isbn>" + _isbn + "</isbn>" \ 
        + "<price>" + str(_price) + "</price>" \ 
        + "<picture>" + _picture + "</picture>" \ 
        + "<link>" + _link + "</link>" 

    return xmlString 

本來,我其實是有MakeXMLString作爲類中的一個方法,像這樣:0

def MakeXMLString(self): 
    self.xmlString = "<name>" + self.name + "</name>" \ 
        + "<isbn>" + self.isbn + "</isbn>" \ 
        + "<price>" + str(self.price) + "</price>" \ 
        + "<picture>" + self.picture + "</picture>" \ 
        + "<link>" + self.link + "</link>" 

在這種情況下,包含在此呼籲:

在這兩種情況下,試圖實例從另一個文件BookDisplay時:

from bookdisplay import BookDisplay 
... 
... 
thumbnails = [] 
... 
thumbnails.append(BookDisplay(titleField, "-1", float(priceField), imgField, linkField)) 

...我碰到下面的全局名稱錯誤(這回溯特別是對於不-within-class功能):

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "search.py", line 30, in ebaySearch 
    handleDocument(doc) 
    File "search.py", line 59, in handleDocument 
    handleItems(items, outputFile) 
    File "search.py", line 102, in handleItems 
    thumbnails.append(BookDisplay(titleField, "-1", float(priceField), imgField, linkField)) 
    File "bookdisplay.py", line 15, in __init__ 
    self.xmlString = MakeXMLString(_name, _isbn, _price, _picture, _link) 
NameError: global name 'MakeXMLString' is not defined 

我在這裏失蹤了什麼?從我所知道的,MakeXMLString是完全無障礙的課堂。

回答

2

當你定義MakeXMLString作爲一種方法,它不返回任何東西這麼

將覆蓋self.xmlString並使其指向方法本身。

帶着它現在定義方式,MakeXMLString不能從其他文件訪問,所以你必須這樣做手工導入,以及:

from bookdisplay import BookDisplay, MakeXMLString 

編輯:

後重讀,你不會從其他文件調用MakeXMLString,所以錯誤在bookDisplay.py中;請確保

def MakeXMLString() 

與類定義的縮進級別相同,否則將被解釋爲方法。

+1

奇怪的是,我沒有從我描述的第一種方法(在類方法之外)進行更改,退出解釋器並嘗試再次運行所有內容。它以某種方式工作。我不知道爲什麼。 – nicole 2013-04-30 23:02:51