轻松掌握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 del()函数用法
Mar 24 Python
python抓取百度首页的方法
May 19 Python
Python减少循环层次和缩进的技巧分析
Mar 15 Python
python3 kmp 字符串匹配的方法
Jul 07 Python
python数据持久存储 pickle模块的基本使用方法解析
Aug 30 Python
感知器基础原理及python实现过程详解
Sep 30 Python
python创建学生成绩管理系统
Nov 22 Python
Python数据可视化:饼状图的实例讲解
Dec 07 Python
python字符串下标与切片及使用方法
Feb 13 Python
解决tensorflow/keras时出现数组维度不匹配问题
Jun 29 Python
Windows 平台做 Python 开发的最佳组合(推荐)
Jul 27 Python
基于python实现监听Rabbitmq系统日志代码示例
Nov 28 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
Smarty Foreach 使用说明
2010/03/23 PHP
PHP通过header实现文本文件下载的代码
2010/08/08 PHP
第四章 php数学运算
2011/12/30 PHP
Zend的MVC机制使用分析(二)
2013/05/02 PHP
php生成缩略图填充白边(等比缩略图方案)
2013/12/25 PHP
WIN8.1下搭建PHP5.6环境
2015/04/29 PHP
Laravel实现构造函数自动依赖注入的方法
2016/03/16 PHP
thinkPHP简单实现多个子查询语句的方法
2016/12/05 PHP
调试Javascript代码(浏览器F12及VS中debugger关键字)
2013/01/25 Javascript
简介JavaScript中的getSeconds()方法的使用
2015/06/10 Javascript
基于jquery实现复选框全选,反选,全不选等功能
2015/10/16 Javascript
使用getBoundingClientRect方法实现简洁的sticky组件的方法
2016/03/22 Javascript
jQuery中checkbox反复调用attr('checked', true/false)只有第一次生效的解决方法
2016/11/16 Javascript
Bootstrap的popover(弹出框)在append后弹不出(失效)
2017/02/27 Javascript
JS库之Particles.js中文开发手册及参数详解
2017/09/13 Javascript
[56:56]VG vs LGD 2019国际邀请赛淘汰赛 胜者组 BO3 第一场 8.22
2019/09/05 DOTA
利用python编写一个图片主色转换的脚本
2017/12/07 Python
pandas删除行删除列增加行增加列的实现
2019/07/06 Python
Python range与enumerate函数区别解析
2020/02/28 Python
Python利用for循环打印星号三角形的案例
2020/04/12 Python
python用TensorFlow做图像识别的实现
2020/04/21 Python
Ubuntu权限不足无法创建文件夹解决方案
2020/11/14 Python
CSS3+font字体文件实现圆形半透明菜单具体步骤(图解)
2013/06/03 HTML / CSS
html5手机端页面可以向右滑动导致样式受影响的问题
2018/06/20 HTML / CSS
捷克领先的户外服装及配件市场零售商:ALPINE PRO
2018/01/09 全球购物
自主实习接收函
2014/01/13 职场文书
劳动模范事迹材料
2014/01/19 职场文书
决心书标准格式
2014/03/11 职场文书
目标责任书范文
2014/04/14 职场文书
解除劳动合同证明书
2014/09/26 职场文书
群众路线个人自我剖析材料
2014/10/07 职场文书
MySQL Innodb关键特性之插入缓冲(insert buffer)
2021/04/08 MySQL
MySQL数据库中varchar类型的数字比较大小的方法
2021/11/17 MySQL
不同品牌、不同型号对讲机如何互相通联
2022/02/18 无线电
redis复制有可能碰到的问题汇总
2022/04/03 Redis
教你win10系统中APPCRASH事件问题解决方法
2022/07/15 数码科技