面向对象编程的三大特性:封装、继承、多态。
一、封装
封装是对具体对象的一种抽象,即将某些部分隐藏起来,在程序外部看不到,其他程序无法调用。封装离不开“私有化”,就是将类或者函数中的某些属性限制在某个区域内,外部无法调用。
为什么要进行封装?
1、保护隐私(把不想别人知道的东西封装起来)
2、隔离复杂度(把实现某个功能的方法封装在一个“黑匣子”里,提供给用户的只是一个 入口,通过入口就能实现该功能)
封装的两个层面
1、创建类和对象会分别创建二者的名称空间,我们只能用类名.或obj.的方式去访问里面 的名字,这本身就是一种封装。
2、类中把某些属性和方法隐藏起来(或定义成私有的),只在类的内部使用,外部无法 访问,或留少量入口(函数)供外部访问。
二、继承
继承是实现代码复用的重要手段,如果一个新类继承自一个设计好的类,就直接具备了已有类的特征,大大降低了工作难度。已有类,我们称为父类或者基类,新的类,我们称为子类或者派生类。
继承的种类
1、单继承(深度优先机制)son------> father------> geangfather
单继承指子类只继承一个父类,当对象调用方法时,查找顺序先从自身类找,如果自身类没找到,则去父类找,父类没有,则去,父类的父类找,直到object类。
2、多继承
多继承指子类继承多个父类,并且具有他们的特征。
①遵循左边优先原则
father father
|_______ son _______|
②左边优先一条路走到黑
grandfather
|
father father
|_______ son ______|
③同根根最后执行
____ grendfather____
father father
|_______ son ______|
查看继承顺序: __mor__()
3、方法的重写 super()
当子类与父类拥有同名称的方法时,子类对象调用该方法优先执行自身的方法。实际上就是子类方法的方法覆盖父类的方法,也称为重写。实际的开发中,遵循开放封闭原则。我们并不会完全的重写父类的方法,而是希望同时实现父类的功能。
三、多态
多态:指的是一类事物有多种形态,一个抽象类有多个子类(因而多态的概念依赖于继承),不同的子类对象调用相同的方法,产生不同的执行结果,多态可以增加代码的灵活性。
实现多态的步骤:
1、定义一个父类,实现某个方法。
2、定义多个子类,在子类中重写父类的方法,每个子类方法实现不同的功能。
3、假设我们定义了一个函数,需要一个父类类型对象的参数,那么调用函数的时候,传 入父类不同的子类对象,那么这个函数就会执行不同的功能,这就是多态的体现。
多态的意义:
1、在程序运行过程中展现出动态的特性,在程序编译的时候无法知道调用的是哪个函 数。
2、程序重写必须多态实现,负责没有意义。
3、多态是面向对象组件化程序设计的基础特性。
四、鸭子类型
鸭子类型不要求严格的继承体系,关注的不是对象类型本身,而是它是否具有要调用的方法。
例题:
1、设计一个circle类来表示圆,这个类包含圆的半径以及求周长和面积的函数。 2、再使用这个类创建半径为1-100的圆,并计算出相应的周长及面积。
import math
class Circle(object):
def __init__(self, r):
self.r = r
self.c = 1
self.s = 1
def func2(self):
self.s = math.pi * (self.r ** 2)
return self.s
def func3(self):
self.c = 2 * math.pi * self.r
return self.c
def func():
for i in range(1, 101):
j = Circle(i)
print(f'半径为{i},其周长为{j.func3()},面积为{j.func2()}!')
if __name__ == '__main__':
func()