轻松掌握python设计模式之访问者模式


Posted in Python onNovember 18, 2016

本文实例为大家分享了python访问者模式代码,供大家参考,具体内容如下

"""访问者模式"""
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__属性,内容为一个存储要解析类顺序的元组。"""
    """观察到,super的执行路径和类的__mro__列举的类顺序吻合;而__mro__的顺序可以看作是深搜的结果"""
    for cls in node.__class__.__mro__:
      """方法名"""
      meth_name = 'visit_' + cls.__name__


      """getattr()函数是Python自省的核心函数,具体使用大体如下:
       获取对象引用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)

运行结果如图:

轻松掌握python设计模式之访问者模式

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
复制粘贴功能的Python程序
Apr 04 Python
python实现2048小游戏
Mar 30 Python
Python使用minidom读写xml的方法
Jun 03 Python
详细介绍Python的鸭子类型
Sep 12 Python
Pycharm设置界面全黑的方法
May 23 Python
Python动态生成多维数组的方法示例
Aug 09 Python
python实现可逆简单的加密算法
Mar 22 Python
Python常用特殊方法实例总结
Mar 22 Python
python3.7 使用pymssql往sqlserver插入数据的方法
Jul 08 Python
使用Pycharm分段执行代码
Apr 15 Python
Pythonic版二分查找实现过程原理解析
Aug 11 Python
pycharm 添加解释器的方法步骤
Aug 31 Python
Win10下Python环境搭建与配置教程
Nov 18 #Python
Python Paramiko模块的安装与使用详解
Nov 18 #Python
Python数据分析之真实IP请求Pandas详解
Nov 18 #Python
Python切换pip安装源的方法详解
Nov 18 #Python
Python max内置函数详细介绍
Nov 17 #Python
Python中的日期时间处理详解
Nov 17 #Python
Eclipse和PyDev搭建完美Python开发环境教程(Windows篇)
Nov 16 #Python
You might like
PHP中使用CURL模拟登录并获取数据实例
2014/07/01 PHP
PH P5.2至5.5、5.6的新增功能详解
2014/07/14 PHP
PHP中的traits实现代码复用使用实例
2015/05/13 PHP
thinkPHP使用post方式查询时分页失效的解决方法
2015/12/09 PHP
Linux下源码包安装Swoole及基本使用操作图文详解
2019/04/02 PHP
Javascript 检测、添加、移除样式(className)函数代码
2009/09/08 Javascript
asp.net+jquery滚动滚动条加载数据的下拉控件
2010/06/25 Javascript
两种简单实现菜单高亮显示的JS类代码
2010/06/27 Javascript
Jquery.TreeView结合ASP.Net和数据库生成菜单导航条
2010/08/27 Javascript
JavaScript 放大镜 放大倍率和视窗尺寸
2011/05/09 Javascript
浅谈javascript对象模型和function对象
2014/12/26 Javascript
JavaScript操作XML/HTML比较常用的对象属性集锦
2015/10/30 Javascript
JS清除文本框内容离开在恢复及鼠标离开文本框时触发js的方法
2016/01/12 Javascript
Angular中自定义Debounce Click指令防止重复点击
2017/07/26 Javascript
Angular4自制一个市县二级联动组件示例
2017/11/21 Javascript
jquery的 filter()方法使用教程
2018/03/22 jQuery
ng-events类似ionic中Events的angular全局事件
2018/09/05 Javascript
vue中使用heatmapjs的示例代码(结合百度地图)
2018/09/05 Javascript
js实现内置计时器
2019/12/16 Javascript
解决vue-router 嵌套路由没反应的问题
2020/09/22 Javascript
基于vue-simple-uploader封装文件分片上传、秒传及断点续传的全局上传插件功能
2021/02/23 Vue.js
[00:55]深扒TI7聊天轮盘语音出处3
2017/05/11 DOTA
python通过getopt模块如何获取执行的命令参数详解
2017/12/29 Python
Pycharm设置utf-8自动显示方法
2019/01/17 Python
Python 实现王者荣耀中的敏感词过滤示例
2019/01/21 Python
python 实现交换两个列表元素的位置示例
2019/06/26 Python
python 三种方法提取pdf中的图片
2021/02/07 Python
HTML5自定义属性的问题分析
2019/08/16 HTML / CSS
PHP使用Redis队列执行定时任务实例讲解
2021/03/24 PHP
文明学生事迹材料
2014/01/29 职场文书
环保专项行动方案
2014/05/12 职场文书
审计局班子四风对照检查材料思想汇报
2014/10/07 职场文书
机动车登记业务委托书
2014/10/08 职场文书
告知书格式
2015/07/01 职场文书
妇联2016年六一国际儿童节活动总结
2016/04/06 职场文书
如何利用python实现Simhash算法
2022/06/28 Python