日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Python 如何實現訪問者模式

瀏覽:138日期:2022-07-16 09:36:42

問題

你要處理由大量不同類型的對象組成的復雜數據結構,每一個對象都需要需要進行不同的處理。比如,遍歷一個樹形結構,然后根據每個節點的相應狀態執行不同的操作。

解決方案

這里遇到的問題在編程領域中是很普遍的,有時候會構建一個由大量不同對象組成的數據結構。假設你要寫一個表示數學表達式的程序,那么你可能需要定義如下的類:

class Node: passclass UnaryOperator(Node): def __init__(self, operand): self.operand = operandclass BinaryOperator(Node): def __init__(self, left, right): self.left = left self.right = rightclass Add(BinaryOperator): passclass Sub(BinaryOperator): passclass Mul(BinaryOperator): passclass Div(BinaryOperator): passclass Negate(UnaryOperator): passclass Number(Node): def __init__(self, value): self.value = value

然后利用這些類構建嵌套數據結構,如下所示:

# Representation of 1 + 2 * (3 - 4) / 5t1 = Sub(Number(3), Number(4))t2 = Mul(Number(2), t1)t3 = Div(t2, Number(5))t4 = Add(Number(1), t3)

這樣做的問題是對于每個表達式,每次都要重新定義一遍,有沒有一種更通用的方式讓它支持所有的數字和操作符呢。這里我們使用訪問者模式可以達到這樣的目的:

class NodeVisitor: def visit(self, node): methname = ’visit_’ + type(node).__name__ meth = getattr(self, methname, None) if meth is None: meth = self.generic_visit return meth(node) def generic_visit(self, node): raise RuntimeError(’No {} method’.format(’visit_’ + type(node).__name__))

為了使用這個類,可以定義一個類繼承它并且實現各種 visit_Name() 方法,其中Name是node類型。例如,如果你想求表達式的值,可以這樣寫:

class Evaluator(NodeVisitor): def visit_Number(self, node): return node.value def visit_Add(self, node): return self.visit(node.left) + self.visit(node.right) def visit_Sub(self, node): return self.visit(node.left) - self.visit(node.right) def visit_Mul(self, node): return self.visit(node.left) * self.visit(node.right) def visit_Div(self, node): return self.visit(node.left) / self.visit(node.right) def visit_Negate(self, node): return -node.operand

使用示例:

>>> e = Evaluator()>>> e.visit(t4)0.6>>>

作為一個不同的例子,下面定義一個類在一個棧上面將一個表達式轉換成多個操作序列:

class StackCode(NodeVisitor): def generate_code(self, node): self.instructions = [] self.visit(node) return self.instructions def visit_Number(self, node): self.instructions.append((’PUSH’, node.value)) def binop(self, node, instruction): self.visit(node.left) self.visit(node.right) self.instructions.append((instruction,)) def visit_Add(self, node): self.binop(node, ’ADD’) def visit_Sub(self, node): self.binop(node, ’SUB’) def visit_Mul(self, node): self.binop(node, ’MUL’) def visit_Div(self, node): self.binop(node, ’DIV’) def unaryop(self, node, instruction): self.visit(node.operand) self.instructions.append((instruction,)) def visit_Negate(self, node): self.unaryop(node, ’NEG’)

使用示例:

>>> s = StackCode()>>> s.generate_code(t4)[(’PUSH’, 1), (’PUSH’, 2), (’PUSH’, 3), (’PUSH’, 4), (’SUB’,),(’MUL’,), (’PUSH’, 5), (’DIV’,), (’ADD’,)]>>>

討論

剛開始的時候你可能會寫大量的if/else語句來實現,這里訪問者模式的好處就是通過 getattr() 來獲取相應的方法,并利用遞歸來遍歷所有的節點:

def binop(self, node, instruction): self.visit(node.left) self.visit(node.right) self.instructions.append((instruction,))

還有一點需要指出的是,這種技術也是實現其他語言中switch或case語句的方式。比如,如果你正在寫一個HTTP框架,你可能會寫這樣一個請求分發的控制器:

class HTTPHandler: def handle(self, request): methname = ’do_’ + request.request_method getattr(self, methname)(request) def do_GET(self, request): pass def do_POST(self, request): pass def do_HEAD(self, request): pass

訪問者模式一個缺點就是它嚴重依賴遞歸,如果數據結構嵌套層次太深可能會有問題,有時候會超過Python的遞歸深度限制(參考 sys.getrecursionlimit() )。

在跟解析和編譯相關的編程中使用訪問者模式是非常常見的。Python本身的 ast 模塊值的關注下,可以去看看源碼。

以上就是Python 如何實現訪問者模式的詳細內容,更多關于Python 訪問者模式的資料請關注好吧啦網其它相關文章!

標簽: Python 編程
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
深夜福利一区| 97精品国产福利一区二区三区| 综合日韩av| 91精品韩国| 午夜日韩在线| 亚洲综合婷婷| 国产欧美三级| 成人午夜在线| 激情久久五月| 自拍自偷一区二区三区| 日韩国产欧美视频| 久久免费福利| 亚洲大片在线| 日韩一区二区三区高清在线观看| 亚洲精品欧美| 国产精品115| 久久人人88| 亚洲精品第一| 成人国产精品一区二区网站| 欧美理论视频| 国产欧美一级| 欧美va亚洲va日韩∨a综合色| 亚洲精品高潮| 日韩国产欧美| 亚洲乱码视频| av资源中文在线天堂| 性欧美69xoxoxoxo| 久久国产精品免费一区二区三区| 91免费精品| 男人的天堂久久精品| 欧美日韩 国产精品| 亚洲天堂1区| 日韩高清国产一区在线| 97精品中文字幕| 一区二区国产精品| 视频二区不卡| 国产日产精品_国产精品毛片| 99久久久久国产精品| 91大神在线观看线路一区| 久久91导航| 91欧美极品| 婷婷综合在线| 国产96在线亚洲| 综合激情网站| 在线天堂中文资源最新版| 免费黄网站欧美| 日韩欧美国产精品综合嫩v| 日本天堂一区| 亚洲激情社区| 国产自产自拍视频在线观看| 日韩不卡手机在线v区| 国产精品亚洲一区二区三区在线观看| 日韩精品久久理论片| 欧美99久久| 日韩a一区二区| 日本h片久久| 亚洲欧美日本视频在线观看| 午夜av成人| 国产一区二区三区不卡视频网站 | 蜜桃视频一区二区三区在线观看| 精品中文字幕一区二区三区四区| 日韩精品一区第一页| 日韩和的一区二在线| 国产精品第一| 日韩精品一区二区三区中文在线 | 久久伦理在线| 91中文字幕精品永久在线| 欧美日韩一区自拍| 亚洲小说春色综合另类电影| 一区在线免费| 亚洲高清av| 日韩中文视频| а√在线中文在线新版| 精品国内亚洲2022精品成人| 国产欧美啪啪| 日韩精品中文字幕吗一区二区 | 91tv亚洲精品香蕉国产一区| 麻豆传媒一区二区三区| 日本欧美韩国一区三区| 伊人久久大香伊蕉在人线观看热v| 亚洲五月婷婷| 久久亚洲专区| 亚洲国内欧美| 亚洲一级特黄| 婷婷综合在线| 伊人成人网在线看| 在线综合亚洲| 麻豆精品91| 美国欧美日韩国产在线播放| 亚洲欧美日本视频在线观看| 尤物在线精品| 亚洲精品一区二区在线看| 欧美一区久久久| 日韩精品看片| 蜜桃视频在线观看一区二区| 在线一区二区三区视频| 久久国产精品久久久久久电车| 午夜久久99| 久久亚洲美女| 日韩精品一级| 国产精品tv| 97欧美在线视频| 久久要要av| 性色av一区二区怡红| 狠狠色综合网| 亚洲资源网站| 97精品国产99久久久久久免费| 日韩福利视频导航| 免费视频一区二区三区在线观看 | 国产欧美日韩在线观看视频| 精品一区二区三区四区五区| 亚洲黄色免费av| 婷婷亚洲综合| 日韩精品乱码av一区二区| 国产精品xxx在线观看| 国产suv精品一区二区四区视频| 亚洲风情在线资源| 午夜日韩福利| 69堂免费精品视频在线播放| 欧美aa在线视频| 91av亚洲| 亚洲综合二区| 国产精品天天看天天狠| 水蜜桃久久夜色精品一区| 免费av一区| 亚洲精品日本| 精品三级av| 国产精品人人爽人人做我的可爱| 日本午夜精品久久久久| 国产福利电影在线播放| 99pao成人国产永久免费视频| 免费在线日韩av| 国产亚洲激情| 久久精品国产成人一区二区三区| 群体交乱之放荡娇妻一区二区| 99国产一区| 国产精品久久乐| 亚洲午夜视频| 欧美日韩 国产精品| 亚洲h色精品| 亚洲制服欧美另类| 国产一区二区三区四区五区| 亚洲女同中文字幕| 国产精品色婷婷在线观看| 蜜桃精品在线| 久久精品99国产国产精| 激情丁香综合| 你懂的国产精品| 好看不卡的中文字幕| 亚洲精品自拍| 91精品国产自产在线观看永久∴| 亚州精品视频| 成人免费电影网址| 日韩精彩视频在线观看| 黄毛片在线观看| 日韩精品中文字幕吗一区二区 | 国产精品宾馆| 136国产福利精品导航网址| 久久国产精品色av免费看| 伊人久久亚洲影院| 91青青国产在线观看精品| 日韩精品免费视频一区二区三区| 久久精品亚洲人成影院 | 日韩三级久久| 久久麻豆精品| 精品久久国产一区| 一区二区亚洲视频| 久久美女性网| 久久伊人国产| 91在线成人| 水野朝阳av一区二区三区| 黄色aa久久| 国产精品宾馆| 日本午夜精品一区二区三区电影| 国产福利91精品一区二区| 日本免费新一区视频| 激情婷婷亚洲| 国产成人免费| 欧美日韩精品一区二区三区视频 | 狠狠久久伊人| 国产日韩一区二区三区在线| 免费精品视频| 一区久久精品| 久久伦理在线| 欧美日韩一区二区三区视频播放| 久久影院资源站| 国产欧美二区| 日韩中文字幕无砖| 午夜久久99| 国产在线日韩| 日韩不卡免费高清视频| 亚洲成人精品| 久久精品国产亚洲夜色av网站| 国产aⅴ精品一区二区四区| 日韩激情精品| 日韩成人av影视| 日韩国产精品久久久| 亚洲视频电影在线| 老牛国产精品一区的观看方式| 婷婷综合网站|