Python之面向对象新式类和经典类

Python之面向对象新式类和经典类

  新式类和经典类的继承原理:

  在Python3中,就只有新式类一种了。

 

  先看Python3中新式类:  

    类是有继承顺序的:

      Python的类是可以继承多个类的,也就是多继承。

      Python的类如果继承了多个类,那么其寻找的方法有两种,分贝为:深度优先 and  广度优先。    

 

    当类是经典类时:多继承状态下,按深度优先查找。

    当类是新式类时:多继承状态下,按广度优先查找。

    广度优先的顺序:不走到头,再走完所有分支的情况下走最后的头。

#新式类的继承,在查找属性时遵循:广度优先
# class A(object):
#     def test(self):
#         print('from A')
#     pass
# class B(A):
#     # def test(self):
#     #     print('from B')
#     pass
# class C(A):
#     # def test(self):
#     #     print('from C')
#     pass
# class D(B):
#     # def test(self):
#     #     print('from D')
#     pass
#
# class E(C):
#     # def test(self):
#     #     print('from E')
#     pass
# class F(D,E):
#     # def test(self):
#     #     print('from F')
#     pass
# f1=F()
# # f1.test()
#
# # print(F.__mro__)
# print(F.mro())

#广度优先:F->D->B->E->C->A->object

 

MRO:

  MRO是一种算法,用于计算在继承过程中,类的继承顺序。

  所有父类的MRO列表并遵循如下的三条准则:

    1、子类会优先于父类被检查。

    2、多个父类会根据他们在列表中的顺序被检查。

    3、 如果对下一个类存在两个合法的选择,选择第一个父类。

  注意:MRO的用发只有新式类可以用,Python2的经典类是用不了的。

 

在Python2中的类的新式和经典的区别:

  在Python2中的新式类中,最终的父类要写object,而Python3的新式类不用写。

  其余的新式类和Python3一致。

  Python2中的经典类的继承:

    在Python2中的经典类继承是深度优先的查找原则:

      

 

#python2中经典类的继承,在查找属性时遵循:深度优先
class A:
    # def test(self):
    #     print('from A')
    pass
class B(A):
    # def test(self):
    #     print('from B')
    pass
class C(A):
    # def test(self):
    #     print('from C')
    pass
class D(B):
    # def test(self):
    #     print('from D')
    pass

class E(C):
    # def test(self):
    #     print('from E')
    pass
class F(D,E):
    # def test(self):
    #     print('from F')
    pass
f1=F()
f1.test()

# F->D->B->A->E->C

    

Super的用法:

  在子类里调用父类的方法是,不要直接去调用,不要用 “类名. 方法” 的方法去调用。

  而是用Super的方法。

  Super只能用于新式类。

  Super函数:

    注意:Super函数的参数,第一个类名,一定是自己的类名。

#coding:utf-8
#super在python2中的用法:
    # 1:super(自己的类,self).父类的函数名字
    # 2:super只能用于新式类
class People(object):
    def __init__(self,name,sex,age):
        self.name=name
        self.age=age
        self.sex=sex
        
    def walk(self):
        print('%s is walking' %self.name)
        
class Chinese(People):
    country='China'
    def __init__(self,name,sex,age,language='Chinese'):
        # self.name=name
        # self.sex=sex
        # self.age=age
        # People.__init__(self,name,sex,age)
        super(Chinese,self).__init__(name,sex,age)
        self.language=language
        
c=Chinese('egon','male',18)
print (c.name,c.age,c.sex,c.language)



########  在python3中  ########
class People:
    def __init__(self,name,sex,age):
        self.name=name
        self.age=age
        self.sex=sex
        
    def walk(self):
        print('%s is walking' %self.name)
        
class Chinese(People):
    country='China'
    def __init__(self,name,sex,age,language='Chinese'):
        # self.name=name
        # self.sex=sex
        # self.age=age
        # People.__init__(self,name,sex,age)
        super(Chinese,self).__init__(name,sex,age)
        self.language=language
        
    def walk(self,x):
        super().walk()
        print('子类的x',x)
        
c=Chinese('egon','male',18)
print(c.name,c.age,c.sex,c.language)
c.walk(123)

 

  

posted @ 2018-06-25 14:52  王先生是胖子  阅读(643)  评论(0编辑  收藏  举报