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)
有人请帮我澄清一下。
答案 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
参数引用实例。
如果您不想实例化该课程,可以声明classmethod
或staticmethod
。这些都可以在类本身上调用,而不需要实例:
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
版本没有隐式参数。
除非你有充分的理由这样做,否则你可能不想这样做。