我正在建立一个树和一个字典,将树中的节点映射到唯一的id。当试图访问字典中的对象时,我遇到了一些意想不到的行为。我可以访问对象的一些继承属性,但不能访问其他属性。我提取了项目的一部分,并对其进行了修改,希望可以理解:
#!/usr/bin/env python
IMPORTS = vars()
class Node(object):
SYMTAB = {}
def __init__(self, kwargs={}):
self.ati = kwargs.get(u'@i')
self._add_symbol(self.ati, self)
self.atr = kwargs.get(u'@r')
def _add_symbol(self, k, v):
self.SYMTAB[k] = v
class CompilationUnit(Node):
def __init__(self, kwargs={}):
super(CompilationUnit, self).__init__(kwargs)
self.types = map(lambda x: IMPORTS[x['@t']](x),
kwargs.get('types').get('@e', []))
class BodyDeclaration(Node):
def __init__(self, kwargs={}):
super(BodyDeclaration, self).__init__(kwargs)
class TypeDeclaration(BodyDeclaration):
def __init__(self, kwargs={}):
super(TypeDeclaration, self).__init__(kwargs)
self.members = map(lambda x: IMPORTS[x[u'@t']](x),
kwargs.get(u'members').get(u'@e', []))
class ClassOrInterfaceDeclaration(TypeDeclaration):
def __init__(self, kwargs={}):
super(ClassOrInterfaceDeclaration, self).__init__(kwargs)
class FieldDeclaration(BodyDeclaration):
def __init__(self, kwargs={}):
super(FieldDeclaration, self).__init__(kwargs)
print '*'*10, 'SYMTAB:'
for k,v in self.SYMTAB.items():
print k,v
print '*'*10
print 'SYMTAB[self.atr]:',self.SYMTAB[self.atr]
print self.SYMTAB[self.atr].atr
print self.SYMTAB[self.atr].members
d = {u'@i': 0, u'@r': None, u'@t': u'CompilationUnit', 'types':
{u'@e':
[{u'@t': u'ClassOrInterfaceDeclaration', u'@i': 1, u'@r': 0,
u'members':
{u'@e':
[{u'@t': 'FieldDeclaration', u'@i': 2, u'@r': 1}]}}]}}
c = CompilationUnit(d)
print c
这将产生以下输出:
********** SYMTAB:
0 <__main__.CompilationUnit object at 0x105466f10>
1 <__main__.ClassOrInterfaceDeclaration object at 0x10547c050>
2 <__main__.FieldDeclaration object at 0x10547c150>
**********
SYMTAB[self.atr]: <__main__.ClassOrInterfaceDeclaration object at 0x10547c050>
0
Traceback (most recent call last):
File "class_error.py", line 74, in <module>
c = CompilationUnit(d)
File "class_error.py", line 30, in __init__
kwargs.get('types').get('@e', []))
File "class_error.py", line 29, in <lambda>
self._types = map(lambda x: IMPORTS[x['@t']](x),
File "class_error.py", line 54, in __init__
super(ClassOrInterfaceDeclaration, self).__init__(kwargs)
File "class_error.py", line 45, in __init__
kwargs.get(u'members').get(u'@e', []))
File "class_error.py", line 44, in <lambda>
self._members = map(lambda x: IMPORTS[x[u'@t']](x),
File "class_error.py", line 65, in __init__
print self.SYMTAB[self.atr].members
AttributeError: 'ClassOrInterfaceDeclaration' object has no attribute 'members'
我甚至不知道该从哪里着手解决这个问题。最近,我添加了print self.SYMTAB[self.atr].atr
行,并看到这确实有效。我唯一能想到的是FieldDeclaration
不是从TypeDeclaration
继承的,而members
属性就是在这里定义的。但这又有什么关系呢?我正在访问ClassOrInterfaceDeclaration
节点,它确实从TypeDeclaration
继承?此对象应具有members
属性。关于如何访问此属性,我缺少什么?你知道吗
问题
您的程序中似乎存在多个其他问题,但是:
该部分:
尝试访问您正要创建的
self.members
。你知道吗将
u'@t': u'ClassOrInterfaceDeclaration'
放入d
。在这里:您可以尝试访问
ClassOrInterfaceDeclaration().members
,这正是您要创建的。ClassOrInterfaceDeclaration
的实例化调用包含上述cod的__init__()
的TypeDeclaration
。你知道吗解决方案
在尝试访问成员之前,需要让所有
__init__()
函数都完成。例如,您可以将所有打印移到自己的方法中:输出:
相关问题 更多 >
编程相关推荐