2019年3月12日

描述符与使用描述符自定义property属性

摘要: 先上代码: 我们定义了一个Circle类,其中初始化方法接收一个参数,作为半径,以及一个计算圆面积的方法area。 我们可以通过描述符来代理实例中的radius属性同时增加对radius的合法性校验。 使用@property可以把方法转变成属性 下面我们尝试自己实现python自带的property 阅读全文

posted @ 2019-03-12 12:23 forwardFields 阅读(317) 评论(0) 推荐(0) 编辑

2019年3月11日

协程

摘要: 之前都提到了几次协程,那么今天就来具体看看到底什么是协程,为什么要有协程,python如何实现协程的。 通过对生成器的学习,我们知道,yield val这行代码会给调用next(gen)的客户端产出一个值,然后暂停,把执行权限移交到客户端那里,等到下次客户端再次调用next(gen)的时候,再从yi 阅读全文

posted @ 2019-03-11 14:54 forwardFields 阅读(449) 评论(0) 推荐(0) 编辑

2019年3月8日

上下文管理器和else块

摘要: 今天的主题是讨论以下特性: * with语句和上下文管理器 * for、while、try语句的else子句 使用with语句会设置一个临时的上下文,交给上下文管理器对象控制,并负责清理上下文。这么做主要是为了避免样子代码,易于使用。除了自动关闭文件外,with还有很多其他用途。 else子句与wi 阅读全文

posted @ 2019-03-08 17:06 forwardFields 阅读(168) 评论(0) 推荐(0) 编辑

2019年3月7日

可迭代的对象、迭代器、生成器

摘要: 当我在自己的程序中发现用到了模式,我觉得这就表明某个地方出错了。程序的形式应该仅仅反映它所要解决的问题。代码中其他任何外加的形式都是一个信号,(至少对我来说)表明我对问题的抽象还不够深——这通常意味着自己正在手动完成的事情,本应该通过写代码来让宏的扩展自动实现。 ——Paul Graham Lisp 阅读全文

posted @ 2019-03-07 14:22 forwardFields 阅读(343) 评论(0) 推荐(0) 编辑

运算符重载

摘要: 以前面我们定义过的Vector向量类为例,讨论重载运算符。 运算符重载基础 运算符重载本质上是函数调用。许多面向对象语言都支持运算符重载,如C++,如果使用得当,API会更好用,代码也会更加易于阅读。python也支持运算符重载,只是增加了一些限制: * 不能重载内置类型的运算符 * 不能新建运算符 阅读全文

posted @ 2019-03-07 14:01 forwardFields 阅读(830) 评论(0) 推荐(0) 编辑

2019年3月6日

继承的优缺点

摘要: 今天讨论两个话题 * 子类化内置类型的缺点 * 多重继承和方法解析顺序(__mro__) 许多人都对继承敬而远之。Java不支持多继承,并没有产生什么坏的影响,而C++对多继承的滥用上了很多人的心(笔者也是其中一位)。因此,今天就讨论一下多继承到底是怎么回事。 子类化内置类型很麻烦 直接子类化内置类 阅读全文

posted @ 2019-03-06 18:12 forwardFields 阅读(2104) 评论(0) 推荐(0) 编辑

接口:从协议到抽象基类

摘要: 抽象类表示接口。 Bjarne StroustrupC++之父 Python中的接口和协议 引入抽象基类之前,python就已经很成功了,即便现在也很少有代码使用抽象基类。协议可以看成是非正式的接口,是python这种动态语言实现动态的方式。 接口在动态语言中是如何运作的呢?首先,python中除了 阅读全文

posted @ 2019-03-06 11:24 forwardFields 阅读(399) 评论(0) 推荐(0) 编辑

2019年3月5日

符合python风格的对象

摘要: python自带的对象拥有很多有趣的行为,用户自己定义的类对象也可以实现跟python对象相同的行为。 对象的表示形式 python关于对象的表示提供了两种形式: repr() 便于开发者理解的返回对象的字符串形式 str() 便于用户理解的返回对象的字符串形式 也正是对象的__repr__和__s 阅读全文

posted @ 2019-03-05 17:33 forwardFields 阅读(310) 评论(0) 推荐(0) 编辑

装饰器和闭包(续)

摘要: 实现一个简单的装饰器 定义一个装饰器,它在每次被修饰函数被调用时计时、然后把经过的时间、传入的参数、结果打印出来 需要说明的是,被clock修饰的函数,函数指向的都是clock内部的clocked函数。 @clock def func(...): pass 与func = clock(func)是等 阅读全文

posted @ 2019-03-05 13:38 forwardFields 阅读(243) 评论(0) 推荐(0) 编辑

装饰器和闭包

摘要: 装饰器用来在不修改原函数代码的情况下,增强该函数的功能。要想熟练掌握装饰器,必须理解闭包。 闭包粗略的讲就是保存有状态的函数,它除了在装饰器中有作用之外,还是回调式异步编程和函数式编程的基础。所以闭包的重要性可想而知。 装饰器基础知识 装饰器就本质而言依然是一个函数,他接收一个函数作为参数,然后返回 阅读全文

posted @ 2019-03-05 10:52 forwardFields 阅读(868) 评论(0) 推荐(0) 编辑

导航