Python設計模式 - 訪問者模式

"""

訪問者模式:表示一個作用于某對象結構中的各元素的操作。它可以使你在不改變各元素的類的前提下定義作用于這些元素的新操作。

訪問者模式適用于數(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)

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容