轻松掌握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 相关文章推荐
pycharm 使用心得(七)一些实用功能介绍
Jun 06 Python
详细解析Python当中的数据类型和变量
Apr 25 Python
python中numpy基础学习及进行数组和矢量计算
Feb 12 Python
Python解析并读取PDF文件内容的方法
May 08 Python
如何在Python中实现goto语句的方法
May 18 Python
Python使用MyQR制作专属动态彩色二维码功能
Jun 04 Python
Python进程池Pool应用实例分析
Nov 27 Python
Python语言异常处理测试过程解析
Jan 08 Python
python sorted函数原理解析及练习
Feb 10 Python
Django自关联实现多级联动查询实例
May 19 Python
Django model.py表单设置默认值允许为空的操作
May 19 Python
教你用Python写一个植物大战僵尸小游戏
Apr 25 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
laravel model模型定义实现开启自动管理时间created_at,updated_at
2019/10/17 PHP
PHP实现获取文件mime类型多种方法解析
2020/05/28 PHP
javascript监听鼠标滚轮事件浅析
2014/06/05 Javascript
jQuery实现悬浮在右上角的网页客服效果代码
2015/10/24 Javascript
Bootstrap CSS布局之按钮
2016/12/17 Javascript
深入理解Vue官方文档梳理之全局API
2017/11/22 Javascript
完美解决手机网页中输入框被输入法遮挡的问题
2017/12/19 Javascript
微信小程序实现购物页面左右联动
2019/02/15 Javascript
解决Vue打包上线之后部分CSS不生效的问题
2019/11/12 Javascript
vue实现公告栏文字上下滚动效果的示例代码
2020/06/16 Javascript
Vue 电商后台管理项目阶段性总结(推荐)
2020/08/22 Javascript
python操作数据库之sqlite3打开数据库、删除、修改示例
2014/03/13 Python
全面了解python字符串和字典
2016/07/07 Python
python利用拉链法实现字典方法示例
2017/03/25 Python
Scrapy爬虫实例讲解_校花网
2017/10/23 Python
python Flask 装饰器顺序问题解决
2018/08/08 Python
解决pycharm每次新建项目都要重新安装一些第三方库的问题
2019/01/17 Python
pyqt5实现绘制ui,列表窗口,滚动窗口显示图片的方法
2019/06/20 Python
Python文件操作中进行字符串替换的方法(保存到新文件/当前文件)
2019/06/28 Python
Django中Middleware中的函数详解
2019/07/18 Python
pytorch 模型可视化的例子
2019/08/17 Python
在Python3 numpy中mean和average的区别详解
2019/08/24 Python
Python3 ffmpeg视频转换工具使用方法解析
2020/08/10 Python
matplotlib部件之套索Lasso的使用
2021/02/24 Python
html5与css3小应用
2013/04/03 HTML / CSS
html5 input属性使用示例
2013/06/28 HTML / CSS
捷克母婴用品购物网站:Feedo.cz
2020/12/28 全球购物
土木工程毕业生自荐信
2013/11/12 职场文书
学校文明单位申报材料
2014/05/06 职场文书
2015年党员自我剖析材料
2014/12/17 职场文书
导师对论文的学术评语
2015/01/04 职场文书
小学推普周活动总结
2015/05/07 职场文书
《蚂蚁和蝈蝈》教学反思
2016/02/22 职场文书
导游词之秦皇岛燕塞湖
2020/01/03 职场文书
MySQL 自定义变量的概念及特点
2021/05/13 MySQL
sql注入报错之注入原理实例解析
2022/06/10 MySQL