1. 让组合起来的类来实现多层结构,不用使用嵌套的内置类型
2. 让简单的接口接收函数,而不是类的实例
from collections import defaultdictcurrent = {'a': 1,'b': 2,'c': 3,
}add_to_current = {'f': 4,'e': 5,
}def increment():count = 0def missing():nonlocal countcount += 1return 0result = defaultdict(missing, current)for key, val in add_to_current.items():result[key] += countreturn count, resultcount, result = increment()print(count, result)
某个类如果定义了__call__
特殊方法,那么它的实例就可以像普通的 Python 函数那样调用。
3. 通过@classmethod 多态来构造同一体系中的各类对象
解决的问题:构造对象的办法不够通用
4. 通过 super 初始化超类
super 能够确保菱形继承体系中的共同超类只初始化一次
5. 考虑用 mix-in 类来表示可组合的功能
不实现__init__
方法的类?
6. 优先考虑用 public 属性表示应受保护的数据,不要用 private 属性表示
如果子类中需要用到超类的属性,又不希望对外暴露,考虑申明为保护属性
只有一种情况应该是有私有属性,即避免命名冲突。
7. 自定义的容器类型应该从 collections.abc 继承
python 内置的 collections.abc 模块定义了一系列抽象基类(abstract base class),把每种容器类型应该提供的所有常用方法都写了出来。我们只需要从这样的抽象基类里面继承就好。同时,如果忘了实现某些必备的方法,那么程序会报错,提醒我们这些方法必须实现。