程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

2023-06(2)

继承中>>>广度优先和深度优先的选择策略

发布于2019-08-06 19:13     阅读(726)     评论(0)     点赞(1)     收藏(1)


新式类和经典类的区别在哪里???

就是在多继承上的顺序问题
py2经典类是按深度优先来继承得,新式类是按广度优先来继承的
py3经典类和新式类都是统一按广度优先来继承的

class People(object):  # 新式类    经典类和新式类在多继承上的方式有所不同
    def __init__(self, name, age):
        self.name = name
        self.age = age
        self.friends = []
        print("---doens't run ")

    def eat(self):
        print("%s is eating..." % self.name)

    def sleep(self):
        print("%s is sleeping..." % self.name)

    def talk(self):
        print("%s is talking..." % self.name)


class Relation(object):
    def __init__(self, n1, n2):
        print("init in relation")

    def make_friends(self, obj):
        print("%s is making friends with %s" % (self.name, obj.name))
        self.friends.append(obj)


class Man(People, Relation):  # 如果两个都有够着函数的话,谁在前面就执行谁的实例化,从左到右。如果其中一个没有,就执行另外一个的构造函数

    def piao(self):
        print("%s is piaoing...20s...done" % self.name)

    def sleep(self):
        People.sleep(self)  # 调用父类的方法,在执行子类的方法,加self就是把自己实例传进去
        print("man is sleeping")


class Women(People, Relation):
    def get_birth(self):
        print("%s is born a baby..." % self.name)


m1 = Man("zhangsan", 8)

# 结果:
# init in relation      当Relation在前面时,就去执行Relation,的实例化参数。class Man(Relation,People)
# ---doens't run        当People在前面时,就去执行People,的实例化参数。class Man(People,Relation)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46

再看
D继承BC,BC都继承A。继承的策略叫“广度优先”,就是先把横向的策略都查完,在往上面A查。python3里面都是广度优先。同样的场景(D继承BC,BC继承A,B里面没有初始化函数,C和A里面有初始化函数)在python2里面就是“深度优先。但是如果A继承于(object)新式类的话,”
BC里面都有就按D继承的顺序来

在这里插入图片描述

class A:
    def __init__(self):
        print("A")


class B(A):
    def __init__(self):
        print("B")


class C(A):
    def __init__(self):
        print("C")


class D(B, C):
    pass


obj = D()


#结果
# B
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

再看
B里面没有就找C

class A:
    def __init__(self):
        print("A")


class B(A):
    pass
    # def __init__(self):
    #     print("B")


class C(A):
    def __init__(self):
        print("C")


class D(B, C):
    pass


obj = D()


#结果
# C
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

再看
BC里面都没有就找A

class A:
    def __init__(self):
        print("A")


class B(A):
    pass
    # def __init__(self):
    #     print("B")


class C(A):
    pass
    # def __init__(self):
    #     print("C")


class D(B, C):
    pass


obj = D()


#结果
# A
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26


所属网站分类: 技术文章 > 博客

作者:473847837423232

链接:https://www.pythonheidong.com/blog/article/9326/993fad57627d117be167/

来源:python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

1 0
收藏该文
已收藏

评论内容:(最多支持255个字符)