轻松掌握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程序员鲜为人知但你应该知道的17个问题
Jun 04 Python
在Python中使用Neo4j数据库的教程
Apr 16 Python
Python编程入门的一些基本知识
May 13 Python
Django的数据模型访问多对多键值的方法
Jul 21 Python
Django实现的自定义访问日志模块示例
Jun 23 Python
Django 连接sql server数据库的方法
Jun 30 Python
python得到电脑的开机时间方法
Oct 15 Python
Ubuntu中配置TensorFlow使用环境的方法
Apr 21 Python
python中的插入排序的简单用法
Jan 19 Python
Python实现曲线拟合的最小二乘法
Feb 19 Python
jupyter notebook指定启动目录的方法
Mar 02 Python
PyTorch的Debug指南
May 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
微信公众平台开发实现2048游戏的方法
2015/04/15 PHP
php中JSON的使用方法
2015/04/30 PHP
8个必备的PHP功能开发
2015/10/02 PHP
PHP实现的自定义数组排序函数与排序类示例
2016/11/18 PHP
javascript jQuery $.post $.ajax用法
2008/07/09 Javascript
Jsonp 跨域的原理以及Jquery的解决方案
2010/05/18 Javascript
Knockoutjs快速入门(经典)
2012/12/24 Javascript
禁止拷贝网页内容的js代码
2014/01/22 Javascript
jQuery中mouseover事件用法实例
2014/12/26 Javascript
JSON格式的键盘编码对照表
2015/01/29 Javascript
全面解析JavaScript的Backbone.js框架中的Router路由
2016/05/05 Javascript
Form表单按回车自动提交表单的实现方法
2016/11/18 Javascript
两种简单的跨域方法(jsonp、php)
2017/01/02 Javascript
jQuery分页插件jquery.pagination.js使用方法解析
2017/02/09 Javascript
详解node nvm进行node多版本管理
2017/10/21 Javascript
深入理解 webpack 文件打包机制(小结)
2018/01/08 Javascript
开源一个微信小程序仪表盘组件过程解析
2019/07/30 Javascript
Vue+Bootstrap收藏(点赞)功能逻辑与具体实现
2020/10/22 Javascript
[04:27]DOTA2官方论坛水友赛集锦
2013/09/16 DOTA
[00:47]DOTA2荣耀之路6:天火,天火!
2018/05/30 DOTA
Python实现将数据库一键导出为Excel表格的实例
2016/12/30 Python
python实现的登录与提交表单数据功能示例
2019/09/25 Python
TensorFlow自定义损失函数来预测商品销售量
2020/02/05 Python
keras 自定义loss层+接受输入实例
2020/06/28 Python
Django-simple-captcha验证码包使用方法详解
2020/11/28 Python
用CSS3的box-reflect来制作倒影效果
2016/11/15 HTML / CSS
美国创意礼品网站:UncommonGoods
2017/02/03 全球购物
2014自主招生自荐信策略
2014/01/27 职场文书
个人优缺点自我评价
2014/01/27 职场文书
英文求职信范文
2014/05/23 职场文书
律师授权委托书范本
2014/10/07 职场文书
2014年语文教师工作总结
2014/12/18 职场文书
2015年上半年物业工作总结
2015/03/30 职场文书
给女朋友的道歉短信
2015/05/12 职场文书
利用Python多线程实现图片下载器
2022/03/25 Python
如何解决flex文本溢出问题小结
2022/07/15 HTML / CSS