轻松掌握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中输出ASCII大文字、艺术字、字符字小技巧
Apr 28 Python
python通过定义一个类实例作为ftp回调方法
May 04 Python
通过数据库对Django进行删除字段和删除模型的操作
Jul 21 Python
python用装饰器自动注册Tornado路由详解
Feb 14 Python
python 与GO中操作slice,list的方式实例代码
Mar 20 Python
python实现k-means聚类算法
Feb 23 Python
pandas.DataFrame选取/排除特定行的方法
Jul 03 Python
python自动化测试之如何解析excel文件
Jun 27 Python
python对象销毁实例(垃圾回收)
Jan 16 Python
使用Python发现隐藏的wifi
Mar 04 Python
python实现密码强度校验
Mar 18 Python
python使用tkinter实现透明窗体上绘制随机出现的小球(实例代码)
May 17 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数据库封装类(附函数说明)
2010/12/04 PHP
PHP中register_globals参数为OFF和ON的区别(register_globals 使用详解)
2012/02/05 PHP
php操作xml入门之xml基本介绍及xml标签元素
2015/01/23 PHP
php微信高级接口群发 多客服
2016/06/23 PHP
PHP中empty,isset,is_null用法和区别
2017/02/19 PHP
Yii框架Session与Cookie使用方法示例
2019/10/14 PHP
JS 常用校验函数
2009/03/26 Javascript
JS事件Event元素(兼容IE,Firefox,Chorme)
2012/11/01 Javascript
模拟多级复选框效果的jquery代码
2013/08/13 Javascript
javascript对中文按照拼音排序代码
2014/08/20 Javascript
浅谈Node.js中的定时器
2015/06/18 Javascript
js编写的treeview使用方法
2016/11/11 Javascript
深入理解jQuery.data() 的实现方式
2016/11/30 Javascript
详解Vue双向数据绑定原理解析
2017/09/11 Javascript
解决vue 按钮多次点击重复提交数据问题
2018/05/10 Javascript
微信小程序之判断页面滚动方向的示例代码
2018/08/30 Javascript
JavaScript中常用的简洁高级技巧总结
2019/03/10 Javascript
[02:42]DOTA2城市挑战赛收官在即 四强之争风起云涌
2018/06/05 DOTA
用Python的Django框架编写从Google Adsense中获得报表的应用
2015/04/17 Python
python开发之tkinter实现图形随鼠标移动的方法
2015/11/11 Python
PyTorch上搭建简单神经网络实现回归和分类的示例
2018/04/28 Python
python操作excel的方法(xlsxwriter包的使用)
2018/06/11 Python
python中的TCP(传输控制协议)用法实例分析
2019/11/15 Python
PyCharm 解决找不到新打开项目的窗口问题
2021/01/15 Python
HTML5 canvas实现移动端上传头像拖拽裁剪效果
2016/03/14 HTML / CSS
公司面试感谢信
2014/02/01 职场文书
高中微机老师自我鉴定
2014/02/16 职场文书
《猫》教学反思
2014/02/26 职场文书
《宿建德江》教学反思
2014/04/23 职场文书
六查六看个人剖析材料
2014/10/14 职场文书
2014年减负工作总结
2014/12/10 职场文书
小学生必读成语故事大全:送给暑假的你们
2019/07/09 职场文书
导游词之天津古文化街
2019/11/09 职场文书
JavaScript 事件捕获冒泡与捕获详情
2021/11/11 Javascript
MySQL生成千万测试数据以及遇到的问题
2022/08/05 MySQL
Win11如何查看显卡型号 Win11查看显卡型号的方法
2022/08/14 数码科技