轻松掌握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 03 Python
简单介绍Python中的readline()方法的使用
May 24 Python
Python中super的用法实例
May 28 Python
numpy中以文本的方式存储以及读取数据方法
Jun 04 Python
使用python爬取B站千万级数据
Jun 08 Python
Python 串口读写的实现方法
Jun 12 Python
python制作简单五子棋游戏
Jun 18 Python
使用 Python 处理3万多条数据只要几秒钟
Jan 19 Python
利用PyQt中的QThread类实现多线程
Feb 18 Python
python利用pytesseract 实现本地识别图片文字
Dec 14 Python
Python实现一个论文下载器的过程
Jan 18 Python
python开发的自动化运维工具ansible详解
Aug 07 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可能遇到的问题“无法载入mysql扩展” 的解决方法
2007/04/16 PHP
php 操作调试的方法
2012/07/12 PHP
mcrypt启用 加密以及解密过程详细解析
2013/08/07 PHP
thinkphp实现图片上传功能
2016/01/13 PHP
PHP实现微信申请退款功能
2018/10/01 PHP
基于laravel缓冲cache的用法详解
2019/10/23 PHP
javascript iframe内的函数调用实现方法
2009/07/19 Javascript
基于jquery的一个图片hover的插件
2010/04/24 Javascript
Firebug入门指南(Firefox浏览器)
2010/08/21 Javascript
JS跨域总结
2012/08/30 Javascript
多个datatable共存造成多个表格的checkbox都被选中
2013/07/11 Javascript
js中将String转换为number以便比较
2014/07/08 Javascript
JavaScript DOM元素尺寸和位置
2015/04/13 Javascript
js+html5实现canvas绘制椭圆形图案的方法
2016/05/21 Javascript
基于BootStrap的文本编辑器组件Summernote
2017/10/27 Javascript
express默认日志组件morgan的方法
2018/04/05 Javascript
详解Vue组件之作用域插槽
2018/11/22 Javascript
浅谈Vue3.0之前你必须知道的TypeScript实战技巧
2019/09/11 Javascript
Vue中点击active并第一个默认选中功能的实现
2020/02/24 Javascript
[37:47]IG vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
Python学习pygal绘制线图代码分享
2017/12/09 Python
Selenium 滚动页面至元素可见的方法
2020/03/18 Python
PythonPC客户端自动化实现原理(pywinauto)
2020/05/28 Python
解决Python paramiko 模块远程执行ssh 命令 nohup 不生效的问题
2020/07/14 Python
凯普林包包西班牙官网:Kipling西班牙
2019/04/12 全球购物
你对IPv6了解程度
2016/02/09 面试题
应届生法律求职信
2013/10/22 职场文书
自荐书格式
2013/12/01 职场文书
自我鉴定怎么写
2013/12/05 职场文书
畜牧兽医本科生的自我评价
2014/03/03 职场文书
中学生励志演讲稿
2014/04/26 职场文书
工伤私了协议书范本
2014/11/24 职场文书
酒桌上的祝酒词
2015/08/12 职场文书
文艺有韵味的诗句(生命类、亲情类...)
2019/07/11 职场文书
分享提高 Python 代码的可读性的技巧
2022/03/03 Python
MySQL运行报错:“Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggre”解决方法
2022/06/14 MySQL