• 面向对象(三)


    一、新式类的继承原理
    二、经典类的继承原理
    三、super函数
    四、多态与多态性
    五、封装

    一、新式类的继承原理

    新式类继承原则:广度优先

    二、经典类的继承原理

    经典类继承原则:深度优先

    class A(object):
        def test(self):
            print('from A')
    
    class B(A):
        def test(self):
            print('from B')
    
    class C(A):
        def test(self):
            print('from C')
    
    class D(B):
        def test(self):
            print('from D')
    
    class E(C):
        def test(self):
            print('from E')
    
    class F(D,E):
        # def test(self):
        #     print('from F')
        pass
    f1=F()
    f1.test()
    print(F.__mro__) #查看继承顺序,只有新式才有这个属性可以查看线性列表,经典类没有这个属性
    
    

    三、super函数

    子类调用父类函数通过super()

    class Chinese(People): #Chinese继承People
        country='China'
        def __init__(self,name,sex,age,language='Chinese'):  
            #People.__init__(self,name,sex,age) #子类重用父类的__init__()
            super().__init__(name,sex,age) #super方法:子类重用父类的__init__(),不用self
            self.language=language
    
    class Vehicle:  # 定义交通工具类
        Country = 'China'
    
        def __init__(self, name, speed, load, power):
            self.name = name
            self.speed = speed
            self.load = load
            self.power = power
    
        def run(self):
            print('开动啦...')
    
    
    class Subway(Vehicle):  # 地铁
        def __init__(self, name, speed, load, power, line):
            # super(Subway,self) 就相当于实例本身 在python3中super()等同于super(Subway,self)
            super().__init__(name, speed, load, power)
            self.line = line
    
        def run(self):
            print('地铁%s号线欢迎您' % self.line)
            super(Subway, self).run()  #'Subway, self'可有可无
    
    
    class Mobike(Vehicle):  # 摩拜单车
        def __init__(self, name, speed, load, power, code):
            super().__init__(name, speed, load, power)
            self.code = code
        def run(self):
            print('蹬车蹬起来')
            super().run()
    
    line13 = Subway('中国地铁', '180m/s', '1000人/箱', '电', 13)
    line13.run()
    
    bike = Mobike('摩拜单车', '18m/s', '1人/车', '饭', '3dcode')
    bike.run()
    
    

    四、多态与多态性

    多态:同一种事物的多种形态,哺乳动物和两栖动物都继承于动物,子类都继承于父类后,都具备父类的属性,可调用父类的绑定方法
    多态性:同一种调用方式,不同的执行效果

    def func(obj):
        obj.walk()
    #对象都继承了动物类,都具有walk绑定方法,直接调用
    func(people)
    func(cat)
    func(dog)
    

    五、封装

    1.封装的目的
    保护隐私(对外隐藏,对内可见)和隔离复杂度

    2.分装分为两种情况
    第一种:创建类和对象本身就是一种封装,通过类名和对象名调用属性

    第二种:将类中的属性和方法隐藏隐藏起来,只可以在类内部调用,外部无法访问该属性或者方法
    python中通过__双下划线的方式实现隐藏属性,

    class A:
        __x = 12  #__x在定义时就会变形:_A__x
        def __p(self):  #__p(self)在定义时就会变形:_A__p(self)
            print('from a')
    a = A()
    print(a.__x)
    a.__p()
    '''
    执行结果:
    AttributeError: 'A' object has no attribute '__p'
    '''
    
  • 相关阅读:
    初遇Citymaker (十七)
    初遇Citymaker (二十)
    初遇Citymaker (十三)
    初遇Citymaker (十九)
    jQuery easyui datagrid 编辑行试用! 冰糖
    thinkphp 启用 gzip 冰糖
    从《昭君出塞》看国人的历史观
    绍兴沈园 梦断香消四十年
    JVM内存模型、GC垃圾回收
    拆箱、装箱、为什么需要包装类型
  • 原文地址:https://www.cnblogs.com/sunqim16/p/6803657.html
Copyright © 2020-2023  润新知