Python类多重继承

在 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()  
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小廖同志_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值