python基础 13 面向对象特性①

103 阅读3分钟

面向对象特性也称之为:三大基石

一 封装

1. 对象都有明确的边界,把属性保护在边界之内 
    将内部和外部进行了隔离,外部不能直接访问内部属性或方法,内部不能直接访问外部的属性或方法 
    封装也称之为:数据隐藏 
2. 封装的粒度: 
    控制一个对象的范围---边界,封装的目标:属性和方法 
    封装的粒度过大:导致封装的目标过于复杂,不利于各司其职 
    封装的粒度过小:导致封装的目标过于简单,让过程过于复杂 
# class A: 
    # age=18 
# 
# class B: 
    # name='建国' 
    # def hehe(self): 
        # print(age) 
# 
# b=B() 
#b.hehe() 
# print(age) 


class School: 
    class Teacher: 
        pass 
        
    class Student: 
        pass 
        
    teacher=Teacher() 
    student=Student() 
    
    def getClass(self): 
        print('上课') 
s=School() 
print(s.student) 

二 继承

物质---生物---动物---哺乳动物---狗类---哈士奇,泰日天,中华田园犬
继承关系 
    更抽象:父类:是子类的抽象 
    更具体:子类:是父类的具象(特殊) 
汽车---货车+轿车+卡车+客车 

定义形式: class 子类类名(父类类名): 
父类:也称之为基类,超类 BaseClass 
object:是Python中的一个类:根类,是所有类的父类 

class Parent(object): 
    pass 
    
class Children(Parent): 
    pass 

三 继承的特点

1. 子类可以继承父类中的成员 
    属性+方法 统称为成员 
2. 子类不能继承父类中的私有成员 
3. 可扩展性: 
    父类扩展了子类 
4. 多继承 
5. init方法的调用:(子类可以调用父类的成员) 
    1. 当子类拥有__init__()方法时,只会调用子类的方法 
    2. 当子类没有__init__()方法时,会调用父类中的init 
6. 访问父类的init方法:(子类调用父类成员的方法) 
    1. 父类类名.父类方法(self) 
    2. super().父类方法() 
    3. 父类类名().父类方法() 

四 方法覆盖

方法覆盖:子类用特殊的方法实现,替换掉父类继承下来的一般的方法实现 
语法要求:子类和父类中的方法名完全一致 
注意:父类中的方法名不能省略,因为方法名相当于接口,无论子类是否实现了接口,子类都会拥有父类中的方法(接 口) 
接口: 
    接口就是标准
class Animal: 
    def eat(self): 
        print('Animal can eat') 
        
class Dog(Animal): 
    def eat(self): 
        print('dog can eat') 
        
class Cat(Animal): 
    def eat(self): 
        print('cat can eat') 
        
class Fish(Animal): 
    def eat(self): 
        print('fish can eat') 
d=Dog() 
c=Cat() 
f=Fish() 
d.eat() 
c.eat() 
f.eat() 

五 多继承

一个类可以同时继承多个父类 
    语法: 
    class 子类名(父类1,父类2...) 
1. 尽量避免多继承,可能会导致混乱 
2. 多继承中父类的属性和方法有先后继承关系 
3. 钻石继承问题(菱形继承) 
    多个子类共同继承了一个父类,可能会导致资源浪费(创建多次父类) 
    解决方案:使用super() 
    原因:super的底层实现是按照mro实现的 
        mro:继承链式关系 
        mro中的链式关系中,所有的类只会出现一次 
4. 循环继承问题 
    一个类可以有多个子类,也可以有多个父类,其中任何一个父类不能是自己的子类 
    多继承中,子类的子类不能直接继承object 
class A: 
    def __init__(self): 
        print('A') 
        
class B(A): 
    def __init__(self): 
        A.__init__(self) 
        print('B') 
        
class C(A): 
    def __init__(self): 
        A.__init__(self) 
        print('C') 
        
class D(B,C): 
    def __init__(self): 
        B.__init__(self) 
        C.__init__(self) 
        print('D')
        
d=D() # A B A C D A出现了两次,A多占用了一个内存 

============================================ 
#解决??? 

class A: 
    def __init__(self): 
        print('A') 
        
class B(A): 
    def __init__(self): 
        super().__init__() 
        print('B') 
        
class C(A): 
    def __init__(self): 
        super().__init__() 
        print('C') 
        
class D(B,C): 
    def __init__(self): 
        super().__init__() 
        print('D') 
        
d=D() 

class A: 
    def __init__(self): 
        print('A') 
        
class B: 
    def __init__(self): 
        print('B') 
        
class C(A,object): 
    def __init__(self): 
        print('C') 
        
class F(C,object): 
    def __init__(self): 
        print('F') 
        
class D(A,B): 
    def __init__(self): 
        print('D') 
print(C.mro()) 
print(D.mro()) 
print(F.mro()) 

六 补充

Python 2.2版本引入super 
Python2:没有super()用法 
Python3:有super()用法 
1. super(): 
    无参的形式相当于调用super(type,obj): 
2. super(type,obj): 
    type:类 
    obj:实例 
    supertype,obj):选取mro中type类右边的第一个类作为返回对象