在 Python中有6种标准数据类型,分别为:Number(数字)、String(字符串)、List(列表)、Tuple(元组)、Sets(集合)和Dict(字典)。而根据内存中的内容是否可变,分为可变类型与不可变类型。其中,数字、字符串、元组和集合被称为不可变类型,列表和字典称为可变类型。
1. 不可变类型子类化
假定我们需要处理大量的浮点数,将浮点数四舍五入后得到最后的结果。这时我们可以定义这样一个类,用来进行这个操作。
例如:
class RoundFloat(float):
def __new__(cls, val):
return float.__new__(cls,round(val,1))
print(RoundFloat(2.6557))
结果为:
2.7
在这个类里面,通过调用父类的构造器来创建对象,然后实例化float、RoundFloat。这里我们仅仅是从一种类型中派生而来,我们可以使用super()内建函数去捕获对应的父类,然后调用父类的__new__()方法进行实例化。
例如:
class RoundFloat(float):
def __new__(cls, val):
return super(RoundFloat,cls).__new__(cls,round(val,1))
print(RoundFloat(2.6557))
结果为:
2.7
2. 可变类型子类化
子类化一个可变类型与子类化不可变类型很类似,但是我们可能不需要使用__new__()或者是__init__(),因为一般情况下我们定义的类所继承到的类型的默认行为就足够我们用了。
例如:
class SortedKeyDict(dict):
def keys(self):
return sorted(super( SortedKeyDict, self).keys())
d = SortedKeyDict((('zhangsan', 1), ('lisi', 2),('wangwu', 3)))
print("By iterator:".ljust(12), [key for key in d])
print("By keys():".ljust(12), d.keys())
结果为:
By iterator: ['zhangsan', 'lisi', 'wangwu']
By keys(): ['lisi', 'wangwu', 'zhangsan']
3. 多重继承
在 Python 中,多重继承就是允许子类继承多个父类,子类可以调用多个父类的方法和属性。但是,当多个父类拥有相同方法名的方法时,我们通过方法名调用父类方法就有一定的顺序。
例如:
class A(object):
def test(self):
print("this is A.test()")
class B(object):
def test(self):
print("this is B.test()")
def check(self):
print("this is B.check()")
class C(A,B):
pass
class D(A,B):
def check(self):
print("this is D.check()")
class E(C,D):
pass
- 在这个例子中,类C继承自类A和类B,类D继承自类A和类B,类E继承自类C和类D。
在我们调用E.test()时,在类A和类B中都存在这个方法。但是由于在多重继承中遵循广度优先的方式,所以程序最先搜索类E,然后再搜索类C和类D。如果还没找到,再到类A中查找。若类A中存在这个方法,则调用这个方法,若在类A中也没有找到,则再到类B中查找。
调用E.test()结果为:
this is A.test()
如果调用E.check()方法,那么先到类E中查找,然后在类C中查找,再到类D中查找。在类D中找到这个方法,调用这个方法。
调用E.check()的结果为:
this is D.check()