系列文章目录
面向对象编程有三大重要特征:封装、继承和多态。
一、封装
-
含义:
面向对象中的封装就是将与某类对象相关所有的数据与操作放在同一个类中,让这些代码的实现与外界隔离开来,外界想要使用或访问这些代码,就要使用我们定义好的接口。 -
优点:
隐藏了功能的实现,提高了系统的安全性;
使代码更易维护。
二、继承
-
含义:
-
当我们定义好一个类A,这个A继承了另一个类B,那么就称A是B的子类(Subclass),B为A的父类、基类或超类(Base class 、Super class)。
-
通过继承,子类就能获得父类的全部方法和属性,并且还能在此基础上进行覆盖和拓展。
-
-
格式:
class Foo(object): # object是默认的父类,也是所有类的间接或直接父类 pass class Bar(Foo): # Bar继承了Foo pass
-
python支持多继承,一个类可以有多个父类:
class Baz(Base, Foo, Bar): pass
当要使用Baz里的东西时,现在Baz中找,找不到就在父类里找,并且是从左往右找。所以,要注意括号内父类的顺序!
-
方法解析顺序(MRO):
- 多继承的关系有时十分复杂,光一个从左往右找是不能解决问题的,因此python有一套专门的解析机制。在我们定义好一个类时,自动解析好查找顺序,这个顺序叫“方法解析顺序”。
- 方法解析顺序是用C3算法解析确定的。
- 当前类的方法解析顺序保存在
类名.__mro__
这个元组中。
-
super函数:
-
super函数用于在子类中调用父类的成员,最常见的就是调用初始化方法。
-
语法格式:
super(子类名, self).方法名()
,python3中则可以简单得写为super().方法名()
。 -
比如:子类的初始化方法要扩展属性,但又怕将父类的初始化方法覆盖掉,丢掉父类的属性,此时就可以使用super函数:
class Foo(object): def __init__(self, name): self.name = name class Bar(Foo): def __init__(self, name, age): # 调用父类的__init__ # super(Bar, self).__init__(name) # 简写方法 super().__init__(name) self.age = age bar = Bar('tom', 19) print(bar.name, bar.age) # 打印:tom 19;父类的name也被初始化了
-
-
Mixin机制:
多继承容易使类的关系混乱不堪,因此,python提出了Mixin机制,它实际上是一种规范,用来提高多继承代码的可读性。
将一些不好划分的类成员,提取到一个新的类中,再让其它类继承,该类一般加一个后缀名:Mixin,表示该类仅是为了减少继承关系混乱程度而定义的。
三、多态
python是一门动态语言,原生支持多态,不需要额外的操作。
动态语言调用实例方法时不检查类型,只要方法存在,参数正确,就可以调用。这就是动态语言的“鸭子类型”,它并不要求严格的继承体系,一个对象只要“看起来像鸭子,走起路来像鸭子”,那它就可以被看做是鸭子。