使用Python中的Class进行xml映射而没有错误

时间:2017-05-19 10:44:25

标签: python xml class

import xml.etree.ElementTree as ET

from pprint import pprint

class xml_mapping:
    def read_field(xml_node, name):
        return [child.get(name) for child in xml_node.iter('field')]

    def read_map(xml_node):
        f = root.attrib
        dict1 = {f['name']:['input_layer','output_layer','fields']}
        dict1[f['name']][0] = {
            'input_layer': root.find('input_layer').get('name'),
        }
        dict1[f['name']][1] = {
            'output_layer': root.find('output_layer').get('name'),
        }

        for child in xml_node:
            if child.tag == 'field_mapping':
                fields = {}
                for field_name in ['input_name','output_name']:
                    fields[field_name] = read_field(child, field_name)
                dict1[f['name']][2] = {
                    'fields': dict(zip(fields['output_name'],fields['input_name'])),
                }

        return dict1

c = xml_mapping
tree = ET.parse('substation.xml')
root = tree.getroot()
pprint (c.read_map(root))

当我尝试这个时,我收到一个错误:     回溯(最近一次调用最后一次):

 File "C:\Python27\final_xml_mapping_f.py", line 25, in <module>
    pprint (c.read_map(root))
TypeError: read_map() takes exactly 1 argument (2 given)

有人请帮我澄清一下。

1 个答案:

答案 0 :(得分:0)

你有两个问题:

  • 您的方法声明缺少self参数。
  • 您没有实例化您的课程

例如:

class xml_mapping(object):
    def read_fields(self, xml_node, name):
        # ...

    def read_map(self, xml_node):  # needs implicit self parameter
        self.read_fields(x, y)  # call another method

instance = xml_mapping()  # instantiate class
instance.read_map(argument)  # call method

隐式self参数引用实例。

替代

如果您不想实例化该课程,可以声明classmethodstaticmethod。这些都可以在类本身上调用,而不需要实例:

class Foo(object):
    @classmethod
    def bar(cls, arg):
        print arg

    @staticmethod
    def baz(arg):
        print arg

Foo.bar(1)
Foo.baz(2)

classmethod版本中,函数获取一个隐式cls参数,这是类本身。 staticmethod版本没有隐式参数。

除非你有充分的理由这样做,否则你可能不想这样做。