【问题标题】:Python - global name is not defined when calling function from class __init__ methodPython - 从类 __init__ 方法调用函数时未定义全局名称
【发布时间】:2013-04-30 22:35:56
【问题描述】:

我是 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 对班级来说是完全可以访问的。

【问题讨论】:

    标签: python class module


    【解决方案1】:

    当您将MakeXMLString 定义为方法时,它不会返回任何内容

    self.xmlString = self.MakeXMLString()
    

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

    按照您现在定义的方式,MakeXMLString 无法从其他文件访问,因此您也必须手动导入它:

    from bookdisplay import BookDisplay, MakeXMLString
    

    编辑:

    重读时,您没有从另一个文件调用MakeXMLString,因此错误出现在 bookDisplay.py 中;确定

    def MakeXMLString()
    

    与类定义在同一缩进级别,否则将被解释为方法。

    【讨论】:

    • 奇怪的是,我没有对我描述的第一种方法(类方法之外)进行任何更改,退出解释器,并尝试再次运行所有内容。它以某种方式起作用。我不知道为什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-29
    • 1970-01-01
    • 2011-03-26
    • 2017-11-19
    • 2023-03-05
    • 2017-02-03
    • 2013-08-23
    相关资源
    最近更新 更多