提交 6da09d81 authored 作者: James Bergstra's avatar James Bergstra

updated getattr and setattr in Module

上级 e80036df
...@@ -970,6 +970,8 @@ class Module(ComponentDict): ...@@ -970,6 +970,8 @@ class Module(ComponentDict):
def __init__(self): def __init__(self):
super(Module, self).__init__() super(Module, self).__init__()
self.__dict__["local_attr"]={} self.__dict__["local_attr"]={}
self.__dict__["_components"]={}
def __wrapper__(self, x): def __wrapper__(self, x):
""" """
...@@ -978,23 +980,17 @@ class Module(ComponentDict): ...@@ -978,23 +980,17 @@ class Module(ComponentDict):
""" """
return wrap(x) return wrap(x)
def __getattr__(self, attr):
if attr == '_components' and '_components' not in self.__dict__:
self.__dict__['_components'] = {}
try:
rval = self.__dict__["local_attr"][attr]
except KeyError:
raise AttributeError('%s has no %s attribute.' % (self.__class__, attr))
return rval
def __setattr__(self, attr, value): def __setattr__(self, attr, value):
if attr in ('parent', '_components'): # a is a new attribute
self.__dict__[attr] = value # we will use the local_attr dict to store it
return v = self.unpack_member_and_external(value)
elif attr == 'name':
self.__set_name__(value)
return
# this __setattr__ function overrides property.__set__, so we don't worry about a
# setter here
self.__dict__[attr] = v
self.__dict__["local_attr"][attr] = v
@staticmethod
def unpack_member_and_external(v): def unpack_member_and_external(v):
if isinstance(v, Member): if isinstance(v, Member):
print >> sys.stderr, ("WARNING: assignment of Member " print >> sys.stderr, ("WARNING: assignment of Member "
...@@ -1011,20 +1007,35 @@ class Module(ComponentDict): ...@@ -1011,20 +1007,35 @@ class Module(ComponentDict):
elif isinstance(v,(int,bool)): elif isinstance(v,(int,bool)):
return v return v
elif isinstance(v, (list)): elif isinstance(v, (list)):
return map(unpack_member_and_external,v) return map(Module.unpack_member_and_external,v)
elif isinstance(v, (tuple)): elif isinstance(v, (tuple)):
return tuple(map(unpack_member_and_external,v)) return tuple(map(Module.unpack_member_and_external,v))
elif isinstance(v,dict): elif isinstance(v,dict):
v_copy = dict() v_copy = dict()
for k,vv in v.iteritems(): for k,vv in v.iteritems():
v_copy[k]=unpack_member_and_external(vv) v_copy[k]=Module.unpack_member_and_external(vv)
return v return v
else: else:
# raise NotImplementedError # raise NotImplementedError
# print "WARNING: unknow:",v # print "WARNING: unknow:",v
return v return v
self.__dict__["local_attr"][attr] = unpack_member_and_external(value) def old__getattr__(self, attr):
if attr == '_components' and '_components' not in self.__dict__:
self.__dict__['_components'] = {}
try:
rval = self.__dict__["local_attr"][attr]
except KeyError:
raise AttributeError('%s has no %s attribute.' % (self.__class__, attr))
return rval
def old__setattr__(self, attr, value):
"""
"""
if attr in ('parent', '_components'):
self.__dict__[attr] = value
return
self.__dict__["local_attr"][attr] = self.unpack_member_and_external(value)
def build(self, mode, memo): def build(self, mode, memo):
if self in memo: if self in memo:
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论