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

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

Python 如何實現訪問者模式

瀏覽:135日期: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久久,三上悠亚国产精品一区二区三区
欧美成人a交片免费看| 国产精品1luya在线播放| 亚洲精品免费观看| 91精品福利| 欧美三级网址| 福利精品一区| 国产日韩欧美高清免费| 噜噜噜久久亚洲精品国产品小说| 午夜精品一区二区三区国产| 久久av偷拍| 黑丝一区二区三区| 视频福利一区| 亚洲美女久久精品| 欧美一区不卡| 麻豆91精品| 国产亚洲网站| 新版的欧美在线视频| 91亚洲国产成人久久精品| 国产精品nxnn| 日韩av在线免费观看不卡| 日韩1区2区日韩1区2区| 视频一区视频二区中文| www成人在线视频| 久久久久欧美精品| 理论片午夜视频在线观看| 免费在线观看一区二区三区| 亚洲精品裸体| 婷婷亚洲成人| 国产精品a级| 麻豆一区二区在线| 日韩av不卡在线观看| 欧美国产亚洲精品| 麻豆久久一区| 国产亚洲高清在线观看| 国产高清日韩| 高清av一区| 久久的色偷偷| 麻豆精品少妇| 成人精品视频| 免费日韩成人| 精品久久免费| 国产一区国产二区国产三区| 精品入口麻豆88视频| 欧美日韩国产观看视频| 免费成人网www| 日韩在线一区二区| 日韩av不卡一区二区| 国产拍在线视频| 四虎884aa成人精品最新| 亚洲欧美日本国产| 麻豆成人91精品二区三区| 国产91在线播放精品| 亚州精品视频| 国产日韩三级| 国产精品自拍区| 99免费精品| 亚洲区国产区| 国产精品片aa在线观看| 日韩成人综合| 91成人精品| 黄色不卡一区| 国产精品网站在线看| av免费不卡国产观看| 91精品啪在线观看国产18 | 国产精品福利在线观看播放| 精品成av人一区二区三区| 亚洲激情欧美| 色综合视频一区二区三区日韩 | 在线视频观看日韩| 一本一道久久a久久精品蜜桃| 亚洲视频二区| 精品一区二区三区中文字幕在线| 成人在线黄色| 久久久久99| 深夜福利亚洲| 97人人精品| 亚洲视频二区| 中文字幕在线官网| 亚洲精品99| 国产精品亚洲一区二区在线观看 | 亚洲黄色影院| 91午夜精品| 99久久99久久精品国产片果冰 | 91嫩草精品| 久久精品观看| 国产精品magnet| 欧美日韩国产亚洲一区| 久久久噜噜噜| 91精品一区| 一本大道色婷婷在线| 国产精品大片| 香蕉精品999视频一区二区| 青青草国产精品亚洲专区无| 精品中文一区| 精品免费视频| 99久久夜色精品国产亚洲1000部| 欧美日韩国产综合网| 亚洲伊人精品酒店| 日本成人在线不卡视频| 蜜臀av免费一区二区三区| 国产精品久久久免费| 午夜精品婷婷| 蜜桃精品在线| 久久国产三级| 综合激情一区| 91tv亚洲精品香蕉国产一区| 欧美亚洲一区二区三区| 亚洲深深色噜噜狠狠爱网站 | 国产精品尤物| 亚洲欧美成人综合| 亚洲成人va| 麻豆久久久久久| 视频在线观看一区二区三区| 亚洲爱爱视频| 精品国产一区二区三区性色av| 日韩极品在线观看| 亚洲男女av一区二区| 福利在线免费视频| 精品亚洲自拍| 欧美有码在线| 91精品麻豆| 亚洲欧美日韩在线观看a三区| 精品中国亚洲| 精品黄色一级片| 欧美日韩午夜电影网| 一区二区亚洲视频| 美女精品在线| 夜夜精品视频| 欧美一区二区性| 91一区二区| 中文字幕人成乱码在线观看| 欧美精品二区| 国产欧美视频在线| 国产精品九九| 91亚洲无吗| 91精品一区| 亚洲不卡视频| 偷拍亚洲精品| 国产日韩视频| 欧美一区激情| 尤物在线精品| 欧美精品一区二区久久| 999国产精品视频| 成人va天堂| 精品亚洲美女网站| 久久人人精品| 亚洲福利免费| 黑丝一区二区| 日韩精品视频中文字幕| 亚洲人成高清| 日本不卡一区二区| 亚洲无线观看| 亚洲五月综合| 国产欧美大片| 国产精品一区二区av日韩在线| 日韩av影院| 国产情侣一区在线| 国产精品二区影院| 超碰超碰人人人人精品| 日韩成人综合| 亚洲在线网站| 鲁大师成人一区二区三区| 国产精品毛片在线看| 日韩欧美美女在线观看| 日韩精品亚洲专区| 久久精品国产福利| 久久99视频| 色婷婷综合网| 夜夜精品视频| 少妇高潮一区二区三区99| 日本99精品| 另类综合日韩欧美亚洲| 久久精品国产亚洲aⅴ| 精品免费视频| 久久久久亚洲精品中文字幕| 精品国产乱码久久久久久1区2匹| 精品在线网站观看| 亚洲综合电影| 日本一区二区三区视频在线看| 一区二区三区四区日韩| 国产精品永久| 久久久久久黄| 午夜精品网站| 久久国产欧美日韩精品| www成人在线视频| 亚洲综合福利| 成人免费一区| 亚洲三级网址| 日韩一区二区中文| 亚洲午夜久久| 亚洲黄色中文字幕| 午夜电影一区| 成人久久一区| 欧美一级一区| 1024精品久久久久久久久| 国产精品久久久久久久久久妞妞| 亚洲成人不卡| 欧美日一区二区在线观看| 亚洲天堂黄色| 精品免费视频|