在Python中定义变量的问题

0 投票
2 回答
1376 浏览
提问于 2025-04-16 08:46

我正在尝试通过这段代码来写一些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()

撰写回答