Python3 新式类 和 经典类

Python3 新式类 和 经典类


本文由 Luzhuo 编写,转发请保留该信息.
原文: http://blog.csdn.net/Rozol/article/details/71427902


以下代码以Python3.6.1为例
Less is more!
他们的区别主要体现在继承上
Python2.x 找父类初始化函数时, 经典类 按深度优先查找 新式类 按广度优先查找
Python3.x 找父类初始化函数时, 经典类 和 新式类 都是广度优先查找

#!/usr/bin/env python
# coding=utf-8
__author__ = 'Luzhuo'
__date__ = '2017/5/8'
# class_newold # 新式类 和 经典类(旧式类) 的演示
# 他们的区别主要体现在继承上
# Python2.x 找父类初始化函数时, 经典类 按深度优先查找 新式类 按广度优先查找
# Python3.x 找父类初始化函数时, 经典类 和 新式类 都是广度优先查找


# === 经典类 ===
class Ao:
    def __init__(self):
        print("Ao")

    def show(self):
        print("s Ao")


class Bo(Ao):
    def __init__(self):
        print("Bo")

    def show(self):
        Ao.show(self)  # 经典类写法(执行指定的父类函数)
        print("s Bo")


class Co(Ao):
    def __init__(self):
        print("Co")

    def show(self):
        Ao.show(self)
        print("s Co")


class Do(Bo, Co):
    def show(self):
        Bo.show(self)
        Co.show(self)
        print("s Do")




# === 新式类 ===
class An(object):
    def __init__(self):
        print("An")

    def show(self):
        print("s An")


class Bn(An):
    def __init__(self):
        print("Bn")

    def show(self):
        super(Bn, self).show()  # 新式类写法(按父类顺序自己执行)
        print("s Bn")


class Cn(An):
    def __init__(self):
        print("Cn")

    def show(self):
        super(Cn, self).show()
        print("s Cn")


class Dn(Bn, Cn):

    def show(self):
        super(Dn, self).show()
        print("s Dn")



if __name__ == "__main__":
    # 创建对象
    # 初始化 __init__(self)时,只要找到一个就执行初始化,不会再继续执行第二个
    do = Do()  # => Bo
    dn = Dn()  # => Bn

    # 初始化查找顺序为:
    # Python2.x: Bo -> Ao -> Co / Bn -> Cn -> An
    # Python3.x: Bo -> Co -> Ao / Bn -> Cn -> An
    # Python2.x 找父类初始化函数时, 经典类 按深度优先查找 新式类 按广度优先查找
    # Python3.x 找父类初始化函数时, 经典类 和 新式类 都是广度优先查找

    do.show()  # s Ao => s Bo => s Ao => s Co => s Do (自行决定调用)
    dn.show()  # s An => s Cn => s Bn => s Dn (深度优先调用)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值