"""
訪問者模式:表示一個作用于某對象結構中的各元素的操作。它可以使你在不改變各元素的類的前提下定義作用于這些元素的新操作。
訪問者模式適用于數(shù)據(jù)結構相對穩(wěn)定而基于該數(shù)據(jù)結構的操作需要經(jīng)常擴展的系統(tǒng)。因為該模式的優(yōu)點就是增加新的操作很容易。
"""
class?Node(object):
????pass
class?A(Node):
????pass
class?B(Node):
????pass
class?C(A,?B):
????pass
class?Visitor(object):
????def?visit(self,?node,?*args,?**kwargs):
????????meth?=?None
????????"""python支持多重繼承,在解析父類的__init__時,定義解析順序的是子類的__mro__屬性,內(nèi)容為一個存儲要解析類順序的元組。"""
????????"""觀察到,super的執(zhí)行路徑和類的__mro__列舉的類順序吻合;而__mro__的順序可以看作是深搜的結果"""
????????for?cls?in?node.__class__.__mro__:
????????????"""方法名"""
????????????meth_name?=?'visit_'?+?cls.__name__
????????????"""
????????????getattr()函數(shù)是Python自省的核心函數(shù),具體使用大體如下:
????????????獲取對象引用getattr,Getattr用于返回一個對象屬性,或者方法
????????????如果Visitor對象中有屬性meth_name則獲得方法返回的值,否則賦值None
???????????"""
????????????meth?=?getattr(self,?meth_name,?None)
????????????if?meth:
????????????????break
????????if?not?meth:
????????????meth?=?self.generic_visit
????????return?meth(node,?*args,?**kwargs)
????def?generic_visit(self,?node,?*args,?**kwargs):
????????print('通常訪問:?'?+?node.__class__.__name__)
????def?visit_B(self,?node,?*args,?**kwargs):
????????print('訪問_B?'?+?node.__class__.__name__)
a?=?A()
b?=?B()
c?=?C()
visitor?=?Visitor()
visitor.visit(a)
visitor.visit(b)
visitor.visit(c)