昨日内容回顾
-
动态方法与静态方法
动态方法即调用时自动将调用者作为参数传给功能的方法。类内方法默认为动态方法且将对象作为参数传入。
静态方法即与正常的功能相同,需要自行传入所有参数。使用staticmethod装饰器可定义。
若要将类作为参数自动传入方法作为参数,需要使用classmethod装饰器定义。
-
类的继承及其本质
在定义类时,若要使用其他类的名称或方法,需要使用类的继承,定义类时加括号写上要继承的类名。
父类与子类的关系类似于类与对象,父类具有所有子类共有的名称或功能,以节省代码。
-
名称的查找顺序
python中名称的查找遵循相同的原则,从调用名称的位置找起,若同级名称空间中没有要调用的名称,则向上级空间查找。在类中其表现形式为,从对象开始向其所在类,再向类所在父类查找,以此类推。
类的多继承情况下,情况分为两种,若所继承的类最终没有收束到同一父类,则按照继承的先后顺序从左到右查找,若支线上有继承情况,则优先完成支线的查找,所谓深度优先;若继承的类最终收束到同一父类,则最终的父类最后被查找,其他顺序与不收束情况下一致,所谓广度优先。
名称查找的主要目的是使用,因此,在查找时要找尽可能简单的路径进行调用,以节省计算机资源的消耗,这可能是以上查找顺序形成的根据。在多继承的情况下,存在继承关系的类在调用时消耗的资源更少,因此会出现深度优先的情形,广度优先则是因为在调用时遵循的路径其实只有一条,在这种情况下,要选择尽量短的路径以节约资源,在更近的路径上有满足要求的目标,就没有必要去更远的路径调用。
-
经典类与新式类
经典类即在定义时没有继承任何类的类,这样的类在使用时比较麻烦,因为还需要重新定义类所具有的名称及方法,实用价值不高。
python3中默认创建的类为新式类,即在定义时默认继承object类或其子类,这样我们在使用时就可以调用类所具有的基本功能。
在定义类时,顺手使其继承object类,可以保证类在不同python环境中的兼容性。
今日内容概要
- 类的派生的应用
- 类的特性之封装
- 类的特性之多态
- 反射
今日内容详细
类的派生的应用
通过类的派生可以扩充类的功能,实现更加个性化的操作。
使用json模块序列化时,部分数据类型不支持序列化,进行转换时会报错。
通过查看源码,定位报错部位,通过替换函数中使用的JSONEncoder类,为报错的情况添加新的处理措施,最后使用super调用原类中的方法。
类的特性之封装
一般情况下,通过对象名加点的形式可以调用类中的名称,若不想调用者通过直接使用点的形式调该名称,则在定义的时候,使用双下划线加名称的形式可以对其进行隐藏。单下划线也有隐藏之意。
隐藏后的名称表面上不能通过点的形式调用,实际只是被改变了名称,在原名称之前加上了下划线及类名。
被隐藏的名称虽然不能被点调用,但是可以在定义阶段作为变量名调用。通过定义相应的接口完成相应的操作。
通过调用property装饰器可以对对象内方法进行装饰,被装饰的方法的参数只能有对象自身,这样就可以通过直接点的形式获取其对应的结果。
类的特性之多态
同一个类的同一种方法在不同的对象中的表现形式可能不同,这就是类的多态性。
具有相同特征的对象即可归为同一类,即所谓的鸭子类型。
反射
反射为我们提供了通过字符串操作数据的方法。常用的方法有:
hasattr() 判断该对象中是否有指定的名称
getattr() 通过给出的字符串调用对应的名称或方法
setattr() 为对象中指定名称的变量赋值
delattr() 删除对象中指定的名称
标签:调用,封装,定义,继承,多态,特性,查找,名称,方法 From: https://www.cnblogs.com/akazukis/p/16867468.html