建议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设计模式学习之十六——状态模式
一.状态模式的定义 状态模式的关键是区分事务内部和外部的状态,事务内部状态改变往往会带来事务的行为改变. 状态模式中有意思的一点是,一般我们谈到封装,都是优先封装对象的行为,而非对象的状态.但在状态模 ...
随机推荐
- keyboard键盘demo
main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:and ...
- Maven与IDEA结合
转自:https://blog.csdn.net/zzpzheng/article/details/49474671 1. 什么是 Maven,为什么要使用 Maven 而不是 Ant Maven简单 ...
- mysql.connector 事务总结
mysql.connector事务总结: connection.autocommit = 0 (默认值) 事务处理 使用 connection.commit()方法 #!/usr/bin/env py ...
- Python迭代与递归方法实现斐波拉契数列
首先是迭代的方法实现: def f(n): f1, f2, fn = 1, 1, 1 while n>2: fn = f1 + f2 f1 = f2 f2 = fn n = n - 1 retu ...
- Centos7下Docker的使用
一.安装Docker 1.1.查看原有系统是否已经安装docker yum list installed | grep docker 1.2.如果有则不需要继续安装,想重新安装,先卸载 yum -y ...
- mysql连接出现error node【1045】
第一步:在my.ini下找到mysqlid.在后边添加skip-grant-tables 第二步:重新启动mysql服务 第三步:重新设置密码 第四步: 将skip-grant-tables删除掉,保 ...
- 原生js做h5小游戏之打砖块
前言 首先,先说明一下做这个系列的目的:其实主要源于博主希望熟练使用 canvas 的相关 api ,同时对小游戏的实现逻辑比较感兴趣,所以希望通过这一系列的小游戏来提升自身编程能力:关于 es6 语 ...
- [ Linux ] [ OS ] [ memory ] Linux 如何查看系統硬體的記憶體(RAM)資訊
cat /proc/meminfo https://blog.longwin.com.tw/2013/05/linux-ram-memory-info-2013/
- 开源作品-PHP写的JS和CSS文件压缩利器(单文件绿色版)-SuMinify_PHP_1_5
前言: 网站项目需要引用外部文件以减小加载流量,而且第一次加载外部资源文件后,其他同域名的页面如果引用相同的地址,可以利用浏览器缓存直接读取本地缓存资源文件,而不需要每个页面都下载相同的外部资源文件. ...
- Linux vi命令快操作汇总
第一部份:一般指令模式可用的按钮說明,游标移动.复制粘贴.搜寻取代等 一.移动游标的方法h 或 向左方向鍵(←) 游标向左移动一个字节j 或 向下方向鍵(↓) 游标向下移动一个字节k 或 向上方向 ...