Python - 当从类的__init__方法调用函数时,全局名称未定义

3

我是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作为这个类的一个方法,就像这样:

 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>" 

在这种情况下,__init__ 包含了以下调用:
self.xmlString = self.MakeXMLString()

在这两种情况下,当尝试从其他文件实例化BookDisplay时:
from bookdisplay import BookDisplay
...
...
thumbnails = []
...
thumbnails.append(BookDisplay(titleField, "-1", float(priceField), imgField, linkField))

我遇到了以下全局名称错误(特别是对于不在类函数内的回溯):

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是类可以完全访问的。
1个回答

2
当你将MakeXMLString定义为一个方法时,它并没有返回任何内容。
self.xmlString = self.MakeXMLString()

会覆盖self.xmlString并使其指向该方法本身。

按照您目前的定义方式,MakeXMLString无法从其他文件中访问,因此您还需要手动导入它:

from bookdisplay import BookDisplay, MakeXMLString

编辑:

重新阅读后,您没有从其他文件中调用MakeXMLString,因此错误出现在bookDisplay.py中;请确保

def MakeXMLString()

如果函数定义与类定义在同一缩进级别,那么它将被解释为一个方法。请注意缩进。


1
很奇怪的是,我从第一种方法(类方法之外)描述的方式中没有做任何更改,退出解释器后,再次尝试运行所有内容。不知何故它就能工作了。我不知道为什么。 - norman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接