建议53:用状态模式美化代码,关于python-state工具包的理解
" % w.Hour)
。
当i=1,day的状态为workday。然后直到i=6才会改变状态为weekday,也就是说,i的值在1~5时。状态一直是workday。到了6才是weekday,当然7也是weekday。
- 查询对象的当前状态非常麻烦
- 状态切换时假设须要对原状态做一些清理工作,对新的状态做一些初始化工作,那把这个清理和初始化工作都都写在for里面或者原来的状态类里,必定有反复,由于每一个状态都要进行初始化和清理,那我几个状态转换下来,这个for循环已经没法保持好看的身材了。
我们须要一个机制来简化这个问题。
PS:事实上这些问题仅仅是在状态类较多的情况下更加明显,假设仅仅是两到三个状态类,个人意见是随便写。反复两三条没啥问题(或许是自己要求太低。。)
)。
install state直接安装。当时看这个包事实上代码量非常少。于是没有安装,直接贴在了代码上面,哈哈。
。
hasattr推断People中是否有__getattr__。显然People类中没有明显的重载__getattr__方法(在People类中有个默认的__getattr__),所以,运行了else部分。初始化部分初始默认状态,完毕默认状态的初始化,即__begin__方法,然后顺便将People类也初始化,核心是重载了__getattr__()方法。查询People类的属性和方法,这里的name值为people类中day。终于cls初始化和__getattr__被重载,返回cls。
这里要注意。People类的day是静态方法的self參数仅仅是为了理解状态类是的宿主是People的实例。
后面的curr方法查询当前状态,switch方法用于切换状态。
(PS:个人感觉getattr那里理解的还有问题。。)
>>> li = [ "Larry", "Curly" ]>>> li.pop<built-in methodlist object at 0xb76b364c>>>> getattr("pop" )<built-in methodlist object at 0xb76b364c>>>> getattr("append" )( "Moe" )>>> li['Larry', 'Curly', 'Moe']>>> |
从上面的代码能够看出li.pop 等用于 getattr( li, "pop" ),可是这样不是调用pop函数。真正的
的调用是getattr( li, "append" )("Moe")。
回到我们的stateful代码,old__getattr__ = getattr(cls,'__getattribute__'),当__getattr__中传来name參数,就相当于运行了cls.__getattribute__.name,假设查找name属性失败,pass这个异常。继续进行getattr(curr(self),name),这里curr(host)返回的是Workday类和Weekday类,name也是day,然后检查f是否是callable的,然后return f的偏函数,传入一个參数self,最后替换cls里的__init__和__getattr__。返回cls。


建议53:用状态模式美化代码,关于python-state工具包的理解的更多相关文章
- 设计模式19---设计模式之状态模式(State)(行为型)
1.场景模拟 考虑一个在线投票的应用,分为四种情况 正常投票 正常投票以后还继续重复投票 用户恶意投票 黑名单用户 2.不用模式的解决方案 package demo17.state.example1; ...
- Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---状态模式[转]
{没有应用状态模式的代码} //工程文件 program Project1; {$APPTYPE CONSOLE} uses uGumballMachine in 'uGumballMachine. ...
- 重学 Java 设计模式:实战状态模式「模拟系统营销活动,状态流程审核发布上线场景」
作者:小傅哥 博客:https://bugstack.cn - 原创系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! @ 目录 一.前言 二.开发环境 三.状态模式介绍 四.案例场景模拟 1 ...
- C#设计模式系列:状态模式(State)
1.状态模式简介 1.1>.定义 状态模式的核心思想是允许一个对象在它的内部状态改变时改变它的行为,即不同的状态对应不同的行为. 状态模式的针对性很强,当有状态变化的时候可以选择状态模式. 1. ...
- 深入浅出设计模式——状态模式(State Pattern)
模式动机 在很多情况下,一个对象的行为取决于一个或多个动态变化的属性,这样的属性叫做状态,这样的对象叫做有状态的 (stateful)对象,这样的对象状态是从事先定义好的一系列值中取出的.当一个这样的 ...
- iOS开发-状态模式
状态模式允许对象内部状态改变时改变它的行为,对象看起来好像修改了它的类.状态模式看起来和策略模式比较相像,策略模式是将可以互换的行为封装起来,然后通过使用委托的方式,决定使用哪一个行为,状态也是封装行 ...
- 【状态模式】 State Pattern
我们先设计一个场景,饮料自动售卖机,来设计一下它的出售流程. 流程图中,我们可把这个过程看成几个状态: 投币状态,选择饮料状态,售出状态,出售完毕状态. ,有了这个四个状态,我们设计一下界面(很粗略) ...
- Javascript设计模式之我见:状态模式
大家好!本文介绍状态模式及其在Javascript中的应用. 模式介绍 定义 当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类. 状态模式主要解决的是控制一个对象状态的条件表达式 ...
- javascript设计模式学习之十六——状态模式
一.状态模式的定义 状态模式的关键是区分事务内部和外部的状态,事务内部状态改变往往会带来事务的行为改变. 状态模式中有意思的一点是,一般我们谈到封装,都是优先封装对象的行为,而非对象的状态.但在状态模 ...
随机推荐
- Spring Boot:Exception parsing document: template="index", line 7 - column 3
转自:https://blog.csdn.net/u010429286/article/details/75447561
- linux sysbench (一): CPU性能测试详解
网上sysbench教材众多,但没有一篇中文教材对cpu测试参数和结果进行详解. 本文旨在能够让读者对sysbench的cpu有一定了解. 小慢哥的原创文章,欢迎转载 1.sysbench基础知识 s ...
- postgresql 备份(pg_dump,pg_restore)
PG提供物理备份和逻辑备份(本篇主要讲逻辑备份)物理备份:WAL热备份逻辑备份:pg_dump,pg_dumpall,恢复时pg_restore 查看帮助命令: pg_dump --help 跟MyS ...
- WinForm——操作word文档
解决方案资源管理器——引用——(右击)添加引用——COM 1. 安装Office,添加引用COM里面的 Microsoft Word 14.0 Object. Library 2. 导命名空间 usi ...
- JavaWeb详细学习路线图
- Java攻城狮学习路线 - 图转自网络.
- Static variables in JavaScript
function MyClass () { // constructor function var privateVariable = "foo"; //NO:obj.privat ...
- js 根据固定位置获取经纬度--腾讯地图
1.首先引入jq 和 腾讯地图js <script src="../js/jQuery.js"></script> <script charset=& ...
- MemCached总结三:PHP的memcached管理接口
在Web系统中应用MemCached缓存技术,必须使用客户端API(PHP)进行访问,这样才能将用户请求的动态数据,缓存到memcached服务器中,来减少对数据库的访问压力.PHP中提供了用于内存缓 ...
- 写给VC++ Windows开发的初学者 一片不错的博文
不知不觉2010年都过了半年了,想来我学C语言已经12个年头了(从1998年开始),用VC++也有11年了,最早使用Turbo C2.0 ,也学过汇编,后来使用Borland C++3.0 .Micr ...
- PCL:全程详解 VS2010+PCL配置
浑浑噩噩半年时间,终于不得不干点和机器人有关的东西.ICRA和IROS推荐的三维图形库-点云库,几乎成了机器人视觉算法的标配. 参考了几篇文章,最后终于配置成功. 下面是文章地址: 这个有点看头,累积 ...