【Python】Python 用mixin模式让程序更加灵活

这篇具有很好参考价值的文章主要介绍了【Python】Python 用mixin模式让程序更加灵活。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Python 用mixin模式让程序更加灵活

在理解mixin之前,有必要先重温一下模板方法模式。所谓的模板方法模式就是在一个方法中定义一个算法的骨架,并将一些实现步骤延迟到子类中。模板方法可以使子类在不改变算法结构的情况下,重新定义算法中的某些步骤。在这里,算法也可以理解为行为。 模板方法模式在C++或其他语言中并无不妥,但是在Python语言中,则颇有点画蛇添 足的味道。比如模板方法,需要先定义一个基类,而实现行为的某些步骤则必须在其子类中,在Python中并无必要。

class People(object):
def make_tea(self):
teapot = self.get_teapot()
teapot.put_in_tea()
teapot.put_in_water()
return teapot
在这个例子中,get_teapot()方法并不需要预先定义。假设在上班时,使用的是简易茶壶, 而在家里,使用的是功夫茶壶,那么可以这样编写代码:

class OfficePeople(People):
def get_teapot(self):
return SimpleTeapot()
class HomePeople(People):
def get_teapot(self):
return KungfuTeapot()
这段代码工作得很好.虽然看起来像模板方法,但是基类并不需要预先声明抽象方法, 甚至还带来调试代码的便利。假定存在一个People的子类StreetPeople,用以描述“正走在 街上的人”,作为“没有人会随身携带荼壶”的常识的反映,这个类将不会实现get_teapot()方法,所以一跑用make_tea()就会产生一个找不到get_teapot()方法的AttributeError。由此 程序员马上会想到“正走在街上的人”边走边泡茶这样的需求是不合理的,从而能够在更高 层次上考虑业务的合理性,在更接近本源的地方修正错误。 但是.这段代码并不完美。老板(OfficePeople的一个实例)拥有巨大的办公室,他购置 了功夫茶具,他要在办公室喝功夫茶了。怎么办?答案有两种,一种是从OfficePeople继承 子类Boss,里写它的get_teapot(),使它返回功夫茶具;另一个则是把get_teapot()方法提取 出来,把它以多继承的方式做一次静态混人。

class UseSimpleTeapot(object):
def get_teapot(self):
return SimpleTeapot()
class UseKungfuTeapot(object):
def get_teapot(self):
return KungfuTeapot ()
class OfficePeople (People, UseSimpleTeapot) :pass
class HomePeople(People, UseKungfuTeapot):pass
class Boss(People, UseKungfuTeapot):pass
这样就很好地解决了老板在办公室也要喝功夫茶的需求。但是这样的代码仍然没有把 Python的动态性表现出来:当新的需求出现时,需要更改类定义。比如随着公司扩张,越 来越多的人人职,OfficePeople的需求越来越多,开始出现有人不喝茶而是喝咖啡,也有人 既喜欢喝茶还喜欢喝咖啡,出现了喜欢在独立办公室抽雪茄的职业经理人……这些类越来越 多,代码越发难以维护。让我们开始寄望于动态地生成不同的实例。

def simple_tea_people():
people = People()
people.bases += (UseSimpleTeapot,)
return people
def coffee_people():
people = People()
people.base += (UseCoffeepot,)
return people
def tea_and_coffee_people():
people = People()
people.bases += (UseSimpleTeapot, UseCoffeepot,)
return people
def boss():
people = People()
people.bases += (KungfuTeapot, UseCoffeepot,)
return people
这个代码能够运行的原理是,每个类都有一个__bases__属性,它是一个元组,用来存 放所有的基类a与其他静态语言不同,Python语言中的基类在运行中可以动态改变。所以当 我们向其中增加新的基类时,这个类就拥有了新的方法,也就是所谓的混人(mixin)。这种 动态性的好处在于代码获得了更丰富的扩展功能。想象一下,你之前写好的代码并不需要个 性,只要后期为它增加基类,就能够增强功能(或替换原有行为).这多么方便!值得进一步 探索的是,利用反射技术,甚至不需要修改代码。假定我们在0A系统里定义员工的时候, 有一个特性选择页面,在里面可以勾选该员工的需求。比如对于Boss,可以勾选功夫茶和咖 啡,那么通过的代码可能如下:

!pip3 install mixins
Looking in indexes: https://pypi.douban.com/simple
Collecting mixins
/usr/share/python-wheels/urllib3-1.24.1-py2.py3-none-any.whl/urllib3/connectionpool.py:849: InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings
Downloading https://pypi.doubanio.com/packages/0b/0e/d47a96f3c8c4185b4e1b18342c1b989948ac81735e9a7ebde930ec96675e/mixins-0.1.1.tar.gz
Building wheels for collected packages: mixins
Running setup.py bdist_wheel for mixins … [?25ldone
[?25h Stored in directory: /home/yubiao/.cache/pip/wheels/a8/e0/0c/daf93eb5bbdafe0ea33c6fa2d407e60c7148ff83bf7369ec63
Successfully built mixins
Installing collected packages: mixins
Successfully installed mixins-0.1.1
import mixins

def staff():
people = People()
bases =[]
for i in config.checked():
bases,append(getattr(mixins,i))
people.bases += tuple(basest)
return people
看,通过这个框架代码,OA系统的开发人员只需要把员工常见的需求定义成Mixin预 告放在mixins模块中,就可以在不修改代码的情况下通过管理界面满足几乎所有需求了 Python的动态性优势也在这个例子中得到了很好的展现。文章来源地址https://www.toymoban.com/news/detail-686951.html

到了这里,关于【Python】Python 用mixin模式让程序更加灵活的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 软件研发过程中,项目管理工具应该如何选择?

    本文作者:极狐GitLab 资深解决方案架构师 尹学峰 许多企业依旧在用老旧的方式,如Excel离线表格进行项目管理。表格无法简介的呈现出项目的任务分解、完成进度、任务类别等多种项目管理过程中必备的要求,更无法实现与企业员工的日常即时通信系统的打通。往往导致项

    2024年01月17日
    浏览(65)
  • WPF实现更加灵活绑定复杂Command(使用Microsoft XAML Behaviors 库)

    1、安装NuGet          2、在XAML的命名空间引入: 3、使用(这里是设置了一个Canvas的点击事件,其它面板也是类似这样设置):         --我这里的ViewModel部分是这样子的 4、这样就可以在ViewModel中直接给这个Command内容了,不用像之前那么麻烦地绑定Command了,这样更加清晰,

    2024年02月04日
    浏览(46)
  • 项目管理流程文件,招标支撑文件,项目研发,验收等系列支撑文件

    写在前面: 我花了一些时间整理了这些年从事软件行业以来的文档,将它们分类整理后,电脑瞬间变得更加简洁。我整理了数百份软件开发过程中的常用文档,包括项目计划、立项计划、需求分析、概要设计、详细设计、数据库设计、用户操作手册、测试计划、测试分析报告

    2024年02月09日
    浏览(41)
  • 什么是研发项目管理软件?生命奇点 PowerProject 项目管理平台正式启动,打造大数据领域新标杆

    近日,生命奇点(北京)科技有限公司(以下简称“生命奇点”)与北京奥博思软件公司达成合作,奥博思软件将基于 PowerProject 项目管理系统助力生命奇点实现研发项目的全生命周期管理,提效企业管理效率! 生命奇点目前正处于企业发展的转型期,随着业务的发展与规模

    2024年02月20日
    浏览(80)
  • 【Android】使用 `reactor.core.scheduler.Schedulers` 提供的线程池让开发者更加灵活地执行任务

    在 Android 开发中,使用 reactor.core.scheduler.Schedulers 提供的线程池可以让开发者更加灵活地执行任务,并且可以根据具体情况选择最合适的线程。 下面列举几种常用的线程池和其适用场景: Schedulers.single() :该调度器会使用单个线程来执行任务,适用于需要按照先后顺序依次执

    2024年02月09日
    浏览(57)
  • python可以做小程序研发嘛,python可以开发小程序嘛

    本篇文章给大家谈谈python可以做微信小程序开发吗,以及python能不能开发微信小程序,希望对各位有所帮助,不要忘了收藏本站喔。 大家好,给大家分享一下用python编写一个小程序,很多人还不知道这一点。下面详细解释一下用python绘制满天星的流程图。现在让我们来看看!

    2024年02月03日
    浏览(36)
  • python可以做小程序研发嘛,如何用python做小程序

    本篇文章给大家谈谈python可以做小程序研发嘛,以及如何用python做小程序,希望对各位有所帮助,不要忘了收藏本站喔。 目录 一、申请账号 二、安装小程序开发环境并创建项目 三、初识小程序项目结构 四、开发小程序 五、 安装Python开发环境并创建项目 六、开发后端服务

    2024年02月05日
    浏览(43)
  • python可以做小程序研发嘛,python可以做小程序吗

    大家好,小编来为大家解答以下问题,python可以做小程序研发嘛,python可以做小程序吗,今天让我们一起来看看吧! Source code download: 本文相关源码 人生苦短,快学Python! 在使用Python的过程中,我最喜欢的就是Python的各种第三方库,能够完成很多操作。 下面就给大家介绍5个

    2024年01月21日
    浏览(53)
  • python可以做小程序研发嘛,python能做微信小程序吗

    大家好,给大家分享一下python可以做微信小程序开发吗,很多人还不知道这一点。下面详细解释一下。现在让我们来看看! 大家好,给大家分享一下用python编写一个小程序,很多人还不知道这一点。下面详细解释一下用python代码画雪人。现在让我们来看看! 1、python可以写手

    2024年02月03日
    浏览(44)
  • 项目全生命周期管理、资产成果沉淀展示、算力资源灵活调度丨ModelWhale 云端协同创新平台全面赋能数据驱动科研工作

    新基建的浪潮如火如荼,国家顶层政策的引导不仅支持着由数据驱动各垂直领域中的新兴商业市场,也为相关科研市场的发展提供了众多机遇。 但持续的发展也带来了新的问题, 传统基础设施已逐渐不能响应新兴数据驱动研究所需的软硬件支持。 本文将从此类问题出发,为

    2024年02月09日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包