新来的。我也是(非常)python 的新手,并试图理解以下行为。有人可以向我解释为什么这个例子中的两种方法有不同的输出吗?
def map_children(method):
def wrapper(self,*args,**kwargs):
res = method(self,*args,**kwargs)
for child in self._children:
method(child,*args,**kwargs)
return res
return wrapper
class Node(object):
def __init__(self,name,parent=None):
self._namestring = name
if parent:
self._parent = parent
self._children = []
@map_children
def decorated(self):
if hasattr(self,'_parent'):
print '%s (child of %s)'%(self._namestring,self._parent._namestring)
else:
print '%s'% self._namestring
def undecorated(self):
if hasattr(self,'_parent'):
print '%s (child of %s)'%(self._namestring,self._parent._namestring)
else:
print '%s'% self._namestring
for child in self._children:
child.undecorated()
def runme():
parent = Node('parent')
child1 = Node('child1',parent)
child2 = Node('child2',parent)
grandchild = Node('grandchild',child1)
child1._children.append(grandchild)
parent._children.append(child1)
parent._children.append(child2)
print '**********result from decorator**********'
parent.decorated()
print '**********result by hand**********'
parent.undecorated()
这是我系统上的输出:
在[]:testcase.runme() **********装饰师的结果********** 父母 child1(父母的孩子) child2(父母的孩子) **********手工结果********** 父母 child1(父母的孩子) 孙子(child1 的孩子) child2(父母的孩子)
那么为什么装饰调用永远不会下降到孙节点呢?我显然错过了一些关于语法的东西......