轻松掌握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使用py2exe打包程序介绍
Nov 20 Python
Python实现从URL地址提取文件名的方法
May 15 Python
Python简单调用MySQL存储过程并获得返回值的方法
Jul 20 Python
详解Python中contextlib上下文管理模块的用法
Jun 28 Python
Python 装饰器使用详解
Jul 29 Python
Python的mysql数据库的更新如何实现
Jul 31 Python
Python3之文件读写操作的实例讲解
Jan 23 Python
Python Unittest根据不同测试环境跳过用例的方法
Dec 16 Python
分享8点超级有用的Python编程建议(推荐)
Oct 13 Python
在ipython notebook中使用argparse方式
Apr 20 Python
opencv+pyQt5实现图片阈值编辑器/寻色块阈值利器
Nov 13 Python
Python爬虫基础之简单说一下scrapy的框架结构
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文档更新介绍
2011/07/22 PHP
CodeIgniter输出中文乱码的两种解决办法
2014/06/12 PHP
php中socket的用法详解
2014/10/24 PHP
thinkPHP5.0框架简单配置作用域的方法
2017/03/17 PHP
让Laravel API永远返回JSON格式响应的方法示例
2018/09/05 PHP
javascript当onmousedown、onmouseup、onclick同时应用于同一个标签节点Element
2010/01/05 Javascript
JavaScript之HTMLCollection接口代码
2011/04/27 Javascript
FF IE浏览器修改标签透明度的方法
2014/01/27 Javascript
浏览器缩放检测的js代码
2014/09/28 Javascript
让你一句话理解闭包(简单易懂)
2016/06/03 Javascript
JavaScript初学者必看“new”
2017/06/12 Javascript
Vue shopCart 组件开发详解
2018/01/26 Javascript
vue移动端UI框架实现QQ侧边菜单组件
2018/03/09 Javascript
JS插件clipboard.js实现一键复制粘贴功能
2020/12/04 Javascript
vue项目搭建以及全家桶的使用详细教程(小结)
2018/12/19 Javascript
React降级配置及Ant Design配置详解
2018/12/27 Javascript
vue的三种图片引入方式代码实例
2019/11/19 Javascript
Python 的 Socket 编程
2015/03/24 Python
Python学习笔记之解析json的方法分析
2017/04/21 Python
Python中将dataframe转换为字典的实例
2018/04/13 Python
python email smtplib模块发送邮件代码实例
2018/04/26 Python
学习python需要有编程基础吗
2020/06/02 Python
Pytorch上下采样函数--interpolate用法
2020/07/07 Python
matplotlib基础绘图命令之bar的使用方法
2020/08/13 Python
python 实现关联规则算法Apriori的示例
2020/09/30 Python
Python 使用xlwt模块将多行多列数据循环写入excel文档的操作
2020/11/10 Python
Python字符串的15个基本操作(小结)
2021/02/03 Python
css3圆角样式分享自定义按钮样式
2013/12/27 HTML / CSS
班级学习雷锋活动总结
2014/07/04 职场文书
招标承诺书
2014/08/30 职场文书
四风问题查摆剖析材料
2014/10/11 职场文书
2014年工程部工作总结
2014/11/25 职场文书
2015大学生自我评价范文
2015/03/03 职场文书
诚信考试承诺书范文
2015/04/29 职场文书
利用html+css实现菜单栏缓慢下拉效果的示例代码
2021/03/30 HTML / CSS
MySQL中的隐藏列的具体查看
2021/09/04 MySQL