abstract:本文實例為大家分享了python訪問者模式代碼,供大家參考,具體內(nèi)容如下"""訪問者模式""" class Node(object): pass class A(Node): pass class B(Node): &nb
本文實例為大家分享了python訪問者模式代碼,供大家參考,具體內(nèi)容如下
"""訪問者模式""" 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__的順序可以看作是深搜的結(jié)果""" 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)
運行結(jié)果如圖:
更多關(guān)于python設計模式之訪問者模式請關(guān)注PHP中文網(wǎng)(m.miracleart.cn)其他文章!