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

标签 python class module

我是 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

最佳答案

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

self.xmlString = self.MakeXMLString()

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

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

from bookdisplay import BookDisplay, MakeXMLString

编辑:

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

def MakeXMLString()

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

关于Python - 从类 __init__ 方法调用函数时未定义全局名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16310074/

相关文章:

python - 在 PyQt 中使用 Windows 7 任务栏功能

c++ - NodeJS c++ 插件性能

C++ 类和函数输出问题

python - 继承类属性而不声明属性或更好的 OOP

java - 类加载器、类差异

找不到 Luarocks 安装的模块

python - 安装 Python telnetlib 模块

python - Tensorflow 中的损失权重如何工作?

python - 在 Django 模型中创建 Propper 相关对象

python - 将具有十六进制值的符号常量添加到 Python 扩展模块