文件名称:以后的版本中-qt教学大纲
文件大小:5.26MB
文件格式:PDF
更新时间:2024-06-23 19:46:35
python 核心编程 中文版 高清文字版
经典类中,一个 大的问题是,不能对标准类型进行子类化。幸运的是,在 2.2 以后的版本中, 随着类型(types)和类(class)的统一和新式类的引入, 这一点已经被修正。下面,介绍两个子 类化 Python 类型的相关例子,其中一个是可变类型,另一个是不可变类型。 不可变类型的例子 假定你想在金融应用中,应用一个处理浮点数的子类。每次你得到一个贷币值(浮点数给出的), 你都需要通过四舍五入,变为带两位小数位的数值。(当然,Decimal 类比起标准浮点类型来说是个 用来精确保存浮点值的更佳方案,但你还是需要[有时候]对其进行舍入操作!)你的类开始可以 这样写: class RoundFloat(float): def __new__(cls, val): return float.__new__(cls, round(val, 2)) 我们覆盖了__new__()特殊方法来定制我们的对象,使之和标准 Python 浮点数(float)有一些 区别:我们使用 round()内建函数对原浮点数进行舍入操作,然后实例化我们的 float,RoundFloat。 我们是通过调用父类的构造器来创建真实的对象的,float.__new__()。注意,所有的__new()__方 法都是类方法,我们要显式传入类传为第一个参数,这类似于常见的方法如__init__()中需要的 self。 现在的例子还非常简单,比如,我们知道有一个 float,我们仅仅是从一种类型中派生而来等等. 通常情况下, 好是使用 super()内建函数去捕获对应的父类以调用它的__new()__方法,下面,对 它进行这方面的修改: class RoundFloat(float): def __new__(cls, val): return super(RoundFloat, cls).__new__(cls, round(val, 2)) 这个例子还远不够完整,所以,请留意本章我们将使它有更好的表现。下面是一些样例输出: