轻松掌握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字符串连接方式汇总
Aug 21 Python
python中的二维列表实例详解
Jun 19 Python
selenium设置proxy、headers的方法(phantomjs、Chrome、Firefox)
Nov 29 Python
Python正则表达式匹配和提取IP地址
Jun 06 Python
Django中如何使用sass的方法步骤
Jul 09 Python
python tkinter GUI绘制,以及点击更新显示图片代码
Mar 14 Python
python中列表的含义及用法
May 26 Python
Pycharm连接gitlab实现过程图解
Sep 01 Python
python process模块的使用简介
May 14 Python
pandas中关于apply+lambda的应用
Feb 28 Python
基于Python实现股票收益率分析
Apr 02 Python
Python中npy和mat文件的保存与读取
Apr 24 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)四
2006/10/09 PHP
PHP 高手之路(一)
2006/10/09 PHP
php中截取字符串支持utf-8
2007/01/18 PHP
php SQL防注入代码集合
2008/04/25 PHP
PHP 采集获取指定网址的内容
2010/01/05 PHP
PHP中SESSION的注销与清除
2015/04/16 PHP
PHP实现的memcache环形队列类实例
2015/07/28 PHP
详解WordPress中提醒安装插件以及隐藏插件的功能实现
2015/12/25 PHP
PHP实现数据库统计时间戳按天分组输出数据的方法
2017/10/10 PHP
Laravel下生成验证码的类
2017/11/15 PHP
PHP7.1实现的AES与RSA加密操作示例
2018/06/15 PHP
转换json格式的日期为Javascript对象的函数
2010/07/13 Javascript
简单的前端js+ajax 购物车框架(入门篇)
2011/10/29 Javascript
document.getElementBy("id")与$("#id")有什么区别
2013/09/22 Javascript
JavaScript获得页面base标签中url的方法
2015/04/03 Javascript
vue中实现移动端的scroll滚动方法
2018/03/03 Javascript
在vue项目中引入highcharts图表的方法(详解)
2018/03/05 Javascript
React 使用browserHistory项目访问404问题解决
2018/06/01 Javascript
GOJS+VUE实现流程图效果
2018/12/01 Javascript
图解NodeJS实现登录注册功能
2019/09/16 NodeJs
用js编写留言板
2020/03/17 Javascript
vue-router 2.0 跳转之router.push()用法说明
2020/08/12 Javascript
javascript使用canvas实现饼状图效果
2020/09/08 Javascript
vue 判断页面是首次进入还是再次刷新的实例
2020/11/05 Javascript
[04:48]DOTA2上海特锦赛小组赛第三日 TOP10精彩集锦
2016/02/28 DOTA
pandas 层次化索引的实现方法
2019/07/06 Python
对Python中画图时候的线类型详解
2019/07/07 Python
python3.6中@property装饰器的使用方法示例
2019/08/17 Python
struct和class的区别
2015/11/20 面试题
酒吧总经理岗位职责
2013/12/10 职场文书
《乞巧》教学反思
2014/02/27 职场文书
廉洁自律演讲稿
2014/05/22 职场文书
留学生求职信
2014/06/03 职场文书
公司门卫工作职责
2014/06/28 职场文书
工作感想范文
2015/08/07 职场文书
idea编译器vue缩进报错问题场景分析
2021/07/04 Vue.js