轻松掌握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中使用ConfigParser解析ini配置文件实例
Aug 30 Python
Python创建文件和追加文件内容实例
Oct 21 Python
python 接收处理外带的参数方法
Dec 03 Python
Python3.5内置模块之os模块、sys模块、shutil模块用法实例分析
Apr 27 Python
详解Python对JSON中的特殊类型进行Encoder
Jul 15 Python
django中的图片验证码功能
Sep 18 Python
python实现矩阵和array数组之间的转换
Nov 29 Python
Python-opencv 双线性插值实例
Jan 17 Python
python 函数嵌套及多函数共同运行知识点讲解
Mar 03 Python
使用Python三角函数公式计算三角形的夹角案例
Apr 15 Python
一文解决django 2.2与mysql兼容性问题
Jul 15 Python
浅析Python实现DFA算法
Jun 26 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中MVC的开发经验分享
2012/05/17 PHP
Zend Studio去除编辑器的语法警告设置方法
2012/10/24 PHP
typecho插件编写教程(五):核心代码
2015/05/28 PHP
php实现向javascript传递数组的方法
2015/07/27 PHP
php如何执行非缓冲查询API
2016/07/22 PHP
PHP实现的CURL非阻塞调用类
2018/07/26 PHP
常用参考资料(手册)下载或者链接
2006/07/22 Javascript
怎么让脚本或里面的函数在所有图片都载入完毕的时候执行
2006/10/17 Javascript
鼠标右击事件代码(asp.net后台)
2011/01/27 Javascript
js弹出框轻量级插件jquery.boxy使用介绍
2013/01/15 Javascript
javascript常用的正则表达式实例
2014/05/15 Javascript
jquery动感漂浮导航菜单代码分享
2020/04/15 Javascript
谈谈jQuery Ajax用法详解
2015/11/27 Javascript
关于JavaScript作用域你想知道的一切
2016/02/04 Javascript
JavaScript中的this引用(推荐)
2016/08/05 Javascript
jquery Banner轮播选项卡
2016/12/26 Javascript
基于Require.js使用方法(总结)
2017/10/26 Javascript
vue中如何去掉空格的方法实现
2018/11/09 Javascript
VUE接入腾讯验证码功能(滑块验证)备忘
2019/05/07 Javascript
vue input输入框关键字筛选检索列表数据展示
2020/10/26 Javascript
[01:32]2016国际邀请赛中国区预选赛CDEC战队教练采访
2016/06/26 DOTA
[01:35:53]完美世界DOTA2联赛PWL S3 Magma vs GXR 第二场 12.13
2020/12/17 DOTA
Python之父谈Python的未来形式
2016/07/01 Python
python保存二维数组到txt文件中的方法
2018/11/15 Python
python实现图片识别汽车功能
2018/11/30 Python
Python shelve模块实现解析
2019/08/28 Python
anaconda安装pytorch1.7.1和torchvision0.8.2的方法(亲测可用)
2021/02/01 Python
基于css3 animate制作绚丽的动画效果
2015/11/24 HTML / CSS
铁路工务反思材料
2014/02/07 职场文书
党员干部廉洁承诺书
2014/05/28 职场文书
领导班子个人查摆问题对照检查材料
2014/10/02 职场文书
社保缴纳证明申请书
2014/11/03 职场文书
小学班主任评语
2014/12/29 职场文书
小兵张嘎观后感300字
2015/06/03 职场文书
CSS使用伪类控制边框长度的方法
2022/01/18 HTML / CSS
Python的三个重要函数详解
2022/01/18 Python