魔法函数总览
str 和 repr 魔法方法的区别
都是打印为字符串类型。
但是str是易读 简单明了。
repr 是给开发人员看的,会显示类的类型。
多态的概念:java 和 c# 是这一类是强类型语言。使用时,比如整数1 需要声明类型 int a = 1 。
而 python崇尚鸭子类型【即弱类型语言,也可以称为动态语言】。即只需要a=1即可不需要写明类型。
在调用实例方法时不检查类型,只要方法存在,参数正确就可以调用,即【一个对象只要看起来像鸭子,走路像鸭子,就能看作鸭子。】这一类型就是鸭子类型。
python中的多态:定义时的类型和运行时的类型不一样就是多态。
面向对象的三大特征:
- 封装
- 继承
- 多态(定义的时候不知道调用的是谁,还有运行的时候才知道调用的是谁。比如a*2,只有运行的时候在知道a代表什么)
抽象基类介绍
抽象基类(abstract base class,ABC模块):抽象基类就是 类里定义了纯虚成员函数 的类。**纯虚函数只是提供了借口,并没有具体实现。**抽象基类不能被实例化(不能创建对象),通常是作为基类供子类继承,子类中重写虚函数,实现具体的接口。
抽象基类就是 定义各种方法而不做具体实现的类 ,任何继承抽象基类的类必须实现这些方法,否则无法实例化。
抽象基类应用场景
先从collections模块【很多数据类型都封装在该模块中】的abc类型中,导入sized类型。
·我们需要强制某个子类必须实现父类的方法
1、直接在父类方法中编写主动抛出异常。
2、使用抽象基类方法完成
导入abc模块,再定义一个类。
首先,使用抽象基类的时候,父类不再是继承object 而是导入abc模块后,继承abc.ABCMeta
抽象基类特点
- 无法实例化
- 继承类必须具有抽象基类指定方法
抽象基类应用场景
- 检查某个类是否有某种方法
- 强制子类必须实现某些方法
isinstance(对象,判断类型【可以是元组形式填写多个】):判断数据类型,返回布尔值。
比如:
a=1
b=‘耗子’
print( isinstance(a,int))或者print( isinstance(a,(int,str)))【元组形式中可以填写多个数据类型,进行选择判断】
小结
- type:不考虑继承关系,返回说明类型
- isinstance:考虑继承关系,返回布尔值
== 和 is 区别
==:值相等(id可不同)
is:id相同
如图所示:
cls_ins :类属性
self.a 和 send.b:实例属性
当用对象去访问,可以访问类属性和实例属性。因为对象是向上查找
单继承:
当对象有该实例属性的时候,直接输出实例属性。
当对象没有该实例属性的时候,才会向上查找,使用类属性。
多继承:
自省:通过一定的机制查询到对象的内部结构。
python中比较常见的自省(introspecton)机制(函数用法)有:
- dir()【对象所拥有的所有属性,考虑到继承的成员】
- type()【数据类型返回说明类型】
- hasattr()【判断类中是否含有某个方法,返回布尔值】
- isinstance()【判断数据类型,返回布尔值】
通过这些函数,我们能够在程序运行时得知对象的类型,判断对象是否存在某个属性,反问对象的属性。
在多继承的情况下是根据mro顺序查询,单继承的情况下则是根据父类继承方式查询。
super():子类继承父类后在同个方法名中调用父类的方法时使用。
使用方法:super().方法名()
软编码:
super():函数可以替代父类名字。比如当父类曾经叫做one 如果在子类调用使用父类名的话需要one().init()。此时当父类改名为two那么子类中的调用也要将one改成two。容易造成不便,所以直接使用super替代。这样只需要修改子类继承的形参中的父类名。
硬编码:
不使用super去继承父类的方法,而直接使用类名().方法名() 去调用为硬编码,注意传入的形参中self不能少,不然会报错。
它其实是一种设计模式(开发者之间的共识)。最好遵守。
继承是一个”is-a”关系。比如轿车类继承交通工具类,因为轿车是一个(“is-a”)交通工具。一个物品不可能是多种不同的东西,因此就不应该存在多重继承。不过有没有这种情况,一个类的确是需要继承多个类呢?
答案是有,我们还是拿交通工具来举例子,民航飞机是一种交通工具,对于土豪们来说直升机也是一种交通工具。对于这两种交通工具,它们都有一个功能是飞行,但是轿车没有。所以,我们不可能将飞行功能写在交通工具这个父类中。但是如果民航飞机和直升机都各自写自己的飞行方法,又违背了代码尽可能重用的原则(如果以后飞行工具越来越多,那会出现许多重复代码)。
怎么办,那就只好让这两种飞机同时继承交通工具以及飞行器两个父类,这样就出现了多重继承。这时又违背了继承必须是”is-a”关系。这个难题该怎么破?
这时候 Mixin 就闪亮登场了。飞行只是飞机做为交通工具的一种(增强)属性,我们可以为这个飞行的功能单独定义一个(增强)类,称之为 Mixin 类。这个类,是做为增强功能,添加到子类中的。为了让其他开发者,一看就知道这是个 Mixin 类,一般都要求开发者遵循规范,在类名末尾加上 Mixin 。