python类的继承和单例模式 singleton、运算符重载

Python011

python类的继承和单例模式 singleton、运算符重载,第1张

@[toc]

全局只有一个实例

<font color=#03a3e3> 该实现方式在多线程场景下不安全

继承其他类的类称为派生类(derived class)

被其他类继承的类称为这些类的基类(base

class)

需要注意圆括号中基类的顺序:<font color=#03a3e3> 从左到右搜索 <font>

多继承会导致菱形 diamond关系:有至少一个基类可以从子类经由多个继承路径到达

基类方法可能被多次调用

防止重复访问,每个基类只调用一次

通过子类实例对象课调用父类已被覆盖

慎用多继承(二义性)

– 对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型

– 运算符重载不能改变其本来寓意

– 运算符重载只是一种 “语法上的方便” (sugar)

– 是一种函数调用的方式

如果要编写的类是另一个类的特殊版本时,那么就可以使用继承 。原有的类称为父类 , 新类称为子类 。 子类继承了父类的所有属性和方法, 同时子类还可以自定义自己的属性和方法。

定义子类的实例时, 可以通过 子类的 __init__() 方法,给父类的所有属性赋值。

假设有这样的一个 User 类:

接着,我们定义一个 Admin 类,让它继承 User 类:

运行结果:

super() 是一个特殊函数, 它会把父类和子类关联起来。因为父类也称为超类 ( superclass),所以这个函数叫做 super。接着调用父类的 __init__() 方法, 让子类包含父类的所有属性。

子类除了拥有继承父类而来的属性和方法之外,还可以自定义子类自己的属性和方法。

一般情况下,管理员账号比普通账号,拥有更高级别的权限。因此,我们为 Admin 定义一个有别于 User 的 privileges 属性,并定义一个 “打印拥有的权限” 的新方法:

运行结果:

对于继承而来的父类方法, 如果它不符合子类所期望的行为,那么就可以对其重写。 只要在子类中定义一个与父类同名的方法,即可实现重写。

User 本身定义了一个 “是否验证通过” 的方法,Admin 是管理员,所以需要在打印日志中特别标注出来,这时就需要重写父类定义的方法:

运行结果:

通过重写父类方法, 我们就可以让子类即可以保留或改写从父类取其精华,弃其“糟粕”啦。

当实体越来越复杂,对应的类变得越来越大时, 我们可以将这个大型类拆分成多个可协同工作的小类。

比如,账号权限,其实即使是普通账号也是有某些权限的。所以我们把权限定义为一个类,然后在 Admin 中使用它: