不可变类型子类化与可变类型子类化
不可变类型子类化
假定我们需要处理大量的浮点数,将浮点数四舍五入后得到最后的结果。这时我们可以定义这样一个类,用来进行这个操作。例如:
1 class RoundFloat(float): 2 def __new__(cls, val): 3 return float.__new__(cls,round(val,1)) 4 print(RoundFloat(2.6557))
结果为:
2.7
在这个类里面,通过调用父类的构造器来创建对象,然后实例化float、RoundFloat。这里我们仅仅是从一种类型中派生而来,我们可以使用super()内建函数去捕获对应的父类,然后调用父类的__new__()方法进行实例化。例如:
1 class RoundFloat(float): 2 def __new__(cls, val): 3 return super(RoundFloat,cls).__new__(cls,round(val,1)) 4 print(RoundFloat(2.6557))
结果为:
2.7
可变类型子类化
子类化一个可变类型与子类化不可变类型很类似,但是我们可能不需要使用__new__()或者是__init__(),因为一般情况下我们定义的类所继承到的类型的默认行为就足够我们用了。例如:
1 class SortedKeyDict(dict): 2 def keys(self): 3 return sorted(super( SortedKeyDict, self).keys()) 4 d = SortedKeyDict((('zhangsan', 1), ('lisi', 2),('wangwu', 3))) 5 print("By iterator:".ljust(12), [key for key in d]) 6 print("By keys():".ljust(12), d.keys())
结果为:
1 By iterator: ['zhangsan', 'lisi', 'wangwu'] 2 By keys(): ['lisi', 'wangwu', 'zhangsan']
浙公网安备 33010602011771号