Python高级——_13_高级语法(多继承,MRO,Property,魔法方法,With)

单继承

    子类需要使用父类提供的属性

多继承

    一个子类有多个父类

    如果调用父类.__init__构造父类的属性    导致父类的属性被构造多次 产生语义的二义性《钻石继承/菱形继承》

    super关键字作用 可以解决上诉问题

 

MRO方法解析顺序

    特点:在这个顺序所有的类都只初始化一次

    作用:使用这个顺序将所有的类的__init__方法全部调用一次 解决了父类.__init__方式的问题

                                   

    查看MRO

        类.mro()---> 列表   

        类.__mro__--->返回元组    

    顺序特点:

        子类一定在父类的前面    

        兄弟类和继承顺序有关系

 

super

        super关键字的本质就是使用了 MRO顺序  

        super()在 Py3中可以省略参数 py2 不能省略

        py3中默认所有的类都是  新式类<继承object>【没有继承就是金典类】

        py2中如果没有写父类 该类是经典类  如果写了父类该类就是新式类

        super关键字只能用在新式类中  经典类中不能使用super关键字

        super取出当前类在mro顺序的下一个类

 

UML 统一建模语言

        类图  对象图 /静态     活动题  协作图  /动态

 

property   将方法包装为属性

1.装饰器方式

使用property装饰后,可以直接使用函数名取的函数的执行结果

@property        将方法装饰一个对象实例属性·             进行获取

@属性名.setter    将方法装饰为一个对象实力属性        进行设置

@属性名.deleter    将方法装饰为一个对象实例属性      进行删除

以上三种装饰器只限于新式类中

金典类只存在property的方法

 

2.类属性的方式

# 包装成熟性 = property(获取,设置,删除,描述)

age = property(get_age,set_age,del_age,"111")

自动调用方法并获取返回值,参数按照顺序 获取/设置/删除/描述

 

 

魔法方法

__doc__:获取类的描述信息

__module__:显示当前类的定义 所在的模块

__class__:查看当前对象的类型(谁构造的)

    A类是一个对象 类对象   type(A)  == A.__class__

    type是默认情况下创建所有的类的元类  元类 (创建 A类对象的 类)

__del__:对象在内存中释放时触发执行

__call__:设置对象为可调用对象

__dict__:像是对象(类)的所有属性对应的值

__str__:设置 对象转化为str类型时  输出字符串

__getitem__/__setitem__/__delitem__

分别表示索引操作:获取/设置/删除数据

 

with:上下文管理器(Context Manager)

__enter__():上文 返回资源数据

__exit__():下文 关闭资源

任何实现了__enter__()和__exit__()方法的对象都可以称之为上下文管理器

可以使用contextmanager的装饰器

使用yield关键字切分之前运行__enter__()方法,之后运行__exit__()

yield后的值作为函数的返回值

 

相关文章: