面向对象(三)

一、新式类的继承原理
二、经典类的继承原理
三、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'
'''
posted @ 2017-05-03 20:08  六神酱  阅读(144)  评论(0编辑  收藏  举报