大话 python 之 dusk
python胶水用多了难免沾手,会带来一些鸭子特性(行为表现像鸭子,认为它就是鸭子)。本文旨在讲述,python一些不为人知的鸭子性,比如泛型函数,可调用类.... 。python相信函数,本身将装饰器发挥到了极致,包括它的鸭子对象(非经典意义上的对象,与js有得一比)
类可调用
之前,一直奇怪python类的尽管不是真正意义上的类,但为什么不用new,是早期遗留,还是有别的考虑。
- php语境中,通常将具备函数特性的,诸如方法,静态函数,可调用实例,普通函数,匿名函数等视为可调用对象。
- python 有了个lambda,也是可调用对象,同时,python的类实例化形式,不用new,行为表现分明是函数调用鸭子。看官方指引, python类是可调用的,这意味着匿名函数出现的地方,类名在某种情况下也可以代替。
Classes
Classes are callable. These objects normally act as factories for new instances of themselves, but variations are possible for class types that override new(). The arguments of the call are passed to new() and, in the typical case, to init() to initialize the new instance.
import functools
from itertools import *
import pprint
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
data = list(map(Point, cycle(islice(count(), 3)), islice(count(), 7)))
print('Data:')
pprint.pprint(data, width=35)
print()
泛型函数
functools.singledispatch
本质上是一个带有默认实现的,函数转发器,对来路的数据进行了内部断言,转发至外部函数。
类装饰器
某种意义上的代理继承,用在抽象类与实现上,干脆使用register
挂载装饰到新类
自省,反射?
inspect
模块从某种意义上有其它语言反射的特性。它可动态调整运行时的行为,或检查程序的执行环境
谓词函数
认为称之条件函数或测试函数更为合适,返回布尔值,非常适合拦截器,过滤器等应用场景
函数式接口
operator
内置运算符函数式接口,可以间接调用实例对象的方法,属性。有点将运算符函数化味道,同时
具备php中的call_user_func
这类接口函数特性。
abc抽象基类
hasattr()
检查某些方法更加严格,为子类建立一些通用的 API,metaclass=abc.ABCMeta
重复声明
和js动态性一样,python不存在重复声明这一说,其它一些如php同名函数再次定义会报错,python这种动态性虽然方便了@这种装饰器语法糖,但也的确让新手写出奇奇怪怪的代码,使代码的可维护性变差。
方法外化
python 类中方法可以写在类外,有点像golang(数据与操作集分开),似js,c++ 都可以将数据状态与行为相分离,这在php或java这类语言看来,似乎有点反人类。它的类更合适认为是一个命名空间,只是一个模板的接入点。
本作品采用《CC 协议》,转载必须注明作者和本文链接