在Python中定义变量的问题
我正在尝试通过这段代码来写一些xml文件。
docs = XmlReportGenerator()
docs.AddMatchRow('FC Barcelona','Madryt','5:0')
docs.Save()
然后我写了我自己的方法:
from lxml import etree
class XmlReportGenerator:
""""""
root = etree.Element('results')
doc = etree.ElementTree(root)
#----------------------------------------------------------------------
def __init__(self):
""""""
def AddMatchRow(self,teamA,teamB, score):
pageElement = etree.SubElement(root,'Flight',teamA, teamB, score)
""""""
def Save(self,path = None):
outFile = open('Matches.xml', 'w')
doc.write(outFile)
出现了错误:NameError: global name 'root' is not defined(全局名称 'root' 未定义)
程序以退出代码1终止
完成
又出现了错误:NameError: global name 'doc' is not defined(全局名称 'doc' 未定义)
程序以退出代码1终止
完成
我是不是漏掉了什么?我在python方面是个新手(我在c#方面有更多经验)。
2 个回答
2
self
是有原因的。用 self.root
,而不是 root
3
Python 是一种非常明确的编程语言。在 Python 中,实例变量(也就是属于某个对象的变量)前面必须加上 self.
,这样才能告诉程序这个变量是属于哪个对象的。而类变量(也就是属于整个类的变量)前面则需要加上类的名字。
这里有一个修正过的版本。原来的 SubElement
调用也是不正确的:
from lxml import etree
# derive from 'object' if Python 2.X (it is default in Python 3.X)
class XmlReportGenerator(object):
def __init__(self):
# clearer to init instance variables here.
self.root = etree.Element('results')
self.doc = etree.ElementTree(self.root)
def AddMatchRow(self,teamA,teamB, score):
# Need self.root here
pageElement = etree.SubElement(self.root,'Flight')
# Added data elements (or did you want attributes?)
etree.SubElement(pageElement,'teamA').text = teamA
etree.SubElement(pageElement,'teamB').text = teamB
etree.SubElement(pageElement,'score').text = score
def Save(self,path = None):
outFile = open('Matches.xml', 'w')
# Need self.doc here
self.doc.write(outFile)
# This code will run if the script is executed directly,
# but will be skipped if the script is imported by another script.
if __name__ == '__main__':
docs = XmlReportGenerator()
docs.AddMatchRow('FC Barcelona','Madryt','5:0')
docs.Save()