zoukankan      html  css  js  c++  java
  • 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)

      

  • 相关阅读:
    C# 生成 DataMatrix 格式的二维码
    Matlab如何连接Oracle数据库及基本操作
    Matlab调用返回游标的存储过程的分析和处理
    Matlab 调用Oracle数据库
    安装discourse
    设置HttponlyCookie解决mshtml编程无法获取验证码图片流
    C#通过COM组件操作IE浏览器(四):实用代码总结
    C#通过COM组件操作IE浏览器(三):了解IHTMLDocument2
    C#通过COM组件操作IE浏览器(二):使用IHTMLDocument3完成登录
    C#通过COM组件操作IE浏览器(一):打开浏览器跳转到指定网站
  • 原文地址:https://www.cnblogs.com/george92/p/9224278.html
Copyright © 2011-2022 走看看