01 2020 档案
摘要:Python的基础数据类型大多支持比较操作,如 =, ==, =运算符,请在类中定义__ge __()方法。 尽管定义单个方法通常没有问题,但是创建每个可能的比较运算符的实现很快变得很繁琐。 Python模块functools提供了total_ordering类装饰器方法,可用于简化此过程。 要使用
阅读全文
摘要:调用对象的方法,一般分为两步,首先查找对象的属性中是否包含该方法名称,然后是调用函数。 对于简单的情形,可以使用getattr(),如下: 另一个方案是使用operator模块的methodcaller()函数,如下: 如果要按名称查找方法并一次又一次地提供相同的参数,operator.method
阅读全文
摘要:想实现一个状态机或可以在许多不同状态下运行的对象,但又不想在代码中添加很多条件。 一般通过添加不同状态符号来运行不同状态下的代码,如下: 该实现存在两个困难。 首先,由于引入了许多状态条件检查,因此代码变得很复杂。 其次,由于通用操作(例如read()和write())总是在进行操作之前检查状态,因
阅读全文
摘要:说到Python中的类构造函数,一般是实现类的__init__方法,用以实例初始化(__new__用作创建实例)。 但Python不像Java有很显示的方法重载。因此,若要实现多个不同的构造函数,可能需要另辟蹊径。 一个方案是使用类方法classmethod,如下: 如果不实用classmethod
阅读全文
摘要:代理属性访问通常作为类继承的一种替代,最简单的代理属性访问代码如下: 如果只有几个方法需要代理,可以实现类的__getattr__方法,如下: 另一个示例: 常见的约定是,代理只能委派不以下划线开头的属性(即代理仅公开所保留实例的“公共”属性)。 同样重要的是要强调__getattr __()方法通
阅读全文
摘要:想要实现一个自定义类,该类模仿普通的内置容器类型(例如list或dict)的行为。 但是,不确定要实现哪种方法。 collections.abc模块定义了各种抽象基类,这些基类在实现自定义容器类时非常有用。自定义类一般通过继承该模块的对应基类,然后实现所需要的类方法。如下: 简单的继承基类却不实现基
阅读全文

浙公网安备 33010602011771号