今天主要学习了4个部分:property,一些魔法属性和魔法方法,继承的一个深入理解和闭包。
今日重点(需要记忆的部分):
语法糖:其实就是让我们代码在书写的过程中,更加的简洁的一种语法,让我们在使用的时候更加的舒服。
使用存取器方法的好处:
- 安全,隐藏实现细节
- 提供了精确的访问控制权限
- 可以对数据进行有效型控制
property两种用法:
- 类属性:property(fget,fset,fdel,doc)
- 装饰器:
- @property 装饰get方法,在使用的时候,不需要再写get前缀了
- @xxx.setter 装饰set方法,注意使用的时候,一定要放在set方法后
- @xxx.delter 装饰del方法
魔法属性和方法:
__mro__
(方法解析顺序):这个属性用来获取当前类的方法继承顺序(重点知道)在继承时,初始化,查找方法都是基于这个顺序实现的- __call__
- callable()函数 用来判断对象是不是可调用的
- python中,对象分为可变对象和不可变对象;从调用角度区分:可调用对象和不可调用对象。
- 函数是可调用的。
- 默认情况下,一个自定义的实例对象是不可调用对象,如果想让这个自定义的实例对象变成可调用的,需要实现
__call__
方法。 - 看它是不是可调用的,在对象面加一个括号,如果可以将,那么就是可以调用的。
- 如果自定义类实现了
__call__
方法,那么对象在调用时会自动调用__call__
方法。这种对象称为仿函数。
- 继承的深入了解:
钻石继承:
问题:在使用父类名初始化的时候,会出现顶层类被初始化多次的现象。
解决办法:利用super方法super(CurrentClassName,self).__init__(*args, **kwargs)这种有点繁琐,我们使用下面的简化方法
super().__init__(*args, **kwargs)
简单的进行一个分析:
解决钻石继承的问题,就是将所有的父类都继承一遍,但是所有的父类都只初始化一遍,也就是说要将所有的类都走一遍,而且每个类只走一遍,用老师的话来说就是将箭头的最开始一端和最尾端,拉直了,它必须是一条直线。
闭包:
1.在一个外函数中定义一个内函数
2.在内函数中,使用外函数的局部变量
3.外函数返回内函数的引用
其他知识点:
nonlocal
nonlocal相当于global
内函数想修改外函数的变量,需要申明一下,nonlocal
当这个变量是不可变对象的话,引用改变了,所以需要申明
当这个变量是可变对象的话,引用没有发生改变,只是改变了里面的东西。
nonlocal找的是非本地变量,就是不是内函数的变量,外函数的变量
global是找到全局变量,在所有函数的外部。
魔法属性和魔法方法:
__doc__文本字符串
__module__
这个属性用来获取成员的所属模块
__class__
这个属性可以用来获取一个对象的所属类
__bases__
这个属性用来获取当前类的直接父类
__dict__
是一个字典
__setitem__
__getitem__
__delitem__
上面的三个是为了实现,自定义对象支持下标方式访问,得是容器类型
__len__
实现该方法,自定义的类实例对象可以通过len()方法获取长度
__str__
实现自定义类的自定义输出格式