【Python面向对象编程】什么是封装?什么是继承?什么是多态?

引入

Python不仅是一种面向过程编程,也是一种面向对象编程。

面向过程 VS 面向对象

面向过程是以功能为中心,对于需求解的问题分解出一个个的过程,并分别用不同的函数实现,使用时对函数依次调用即可。其不足之处是会导致函数与数据的分离,不利于代码复用,且当程序规模较大时,面向过程会大大降低开发速度,增加程序的修改和维护维度。

面向对象则以对象为中心,通过对象数据以及处理这些数据的相关函数关联起来,便于代码复用和快速开发。

面向对象程序设计的三要素封装、继承和多态,在学习过程中,一直没有弄清楚这三者的区别,从网上找的资料也是众说纷纭,没有理清楚,今天看了清华大学傅老师出的资料书,对这三者有了进一步的认识,这里分享一下学习笔记。

概念解释

对象

对象是由数据和作用于数据的操作构成的。对象的数据成员也可以成为属性,用于描述对象的特征或状态;操作描述对象的动态行为,用函数实现,称为方法

类是具有相同特征和行为的对象的抽象,也就是对象是类的具体化,通俗说对象就是类的实例。类具有的属性和方法被其创建的所有对象共享,对象本身(实例)也可以有自己独特的属性。

封装

封装是指将数据和加工该数据的方法封装成一个整体,是对象的一种重要特性,实现了对象的独立性。比如说我们常用的一些Python包/模块,os模块、fileinput模块、time模块等。封装把对象的designer和user分开,俗话说各司其职,user不用知道对象是怎么设计出来的,能用就行(通过方法接口访问对象),毕竟设计是designer的事~

继承

继承是从已有类创建新类的过程,已有类称为父类或基类,新类称为子类或派生类。继承通过类之间的层次结构来实现,任何类都可以从上层类中继承属性和方法,使得上下层类之间可以共享资源,极大地提高了代码的重用性。比如一个学校新设了一个专业,这个专业服从(继承)学校管理,学校的资源也可以为这个专业所用(继承),当然这个专业也可以自己制定额外的培养方案。

多态

多态是指父类的同一方法在子类中具有不同的表现和行为,即在某个类中重新设计与父类或其它子类名称相同但功能不同的方法,主要通过方法重载实现的。多态允许每个对象以适合自身的方式去响应共同的消息,从而增强了程序的灵活性。这就好比同一个班级的学生,在同一个老师的教导下,具有不同的性格和特长,每个学生(对象)都有自己的价值(作用)。

下面通过两个例子深入了解一下继承和多态。

代码示例

类的继承和子类的使用
class Person:       #Person人基类
    def __init__(self,name,gender,age):  #基类构造方法	 
        self.name = name
        self.gender = gender
        self.age = age

    def displayPerson(self):      #基类实例方法
        print(f'姓名:{self.name} 性别:{self.gender} 年龄:{self.age}')

class Student(Person):      #Student学生类,继承自Person类
    def __init__(self,name,gender,age,num,grade):   #学生类构造方法
        Person.__init__(self,name,gender,age)       #调用基类构造方法
        self.num = num         #学生类新增学号实例属性num
        self.grade = grade     #学生类新增年级实例属性grade

    def displayStudent(self):         #学生类新增实例方法
        Person.displayPerson(self)    #调用基类方法
        print(f'学号:{self.num} 年级:{self.grade}')

class CollegeStudent(Student):   #CollegeStudent大学生类,继承自Student类
    def __init__(self,name,gender,age,num,grade,major):   #大学生类构造方法
        Student.__init__(self,name,gender,age,num,grade)  #调用学生类构造方法
        self.major = major     #大学生类新增专业实例属性major

    def displayCollegeStudent(self):  #大学生类新增实例方法
        Student.displayStudent(self)  #调用学生类方法
        print(f'专业:{self.major}')

Student1=CollegeStudent('王强','男',22,'202002001','大四','通信工程')   
Student1.displayCollegeStudent()
Student2=CollegeStudent('刘红','女',20,'202203002','大二','教育学')   
Student2.displayCollegeStudent()

 运行结果如下:

可以看到在这个例子中,定义了Person、Student、CollegeStudent三个类,其中Student继承自Person,在调用父类(Person)构造方法的同时,也增加了新的实例属性和方法,包括“学号”和“班级”;CollegeStudent继承自Student,在调用父类(Student)构造方法的同时,也增加了新的实例属性和方法,包括“专业”。所以为了输出某大学生的基本信息,要通过CollegeStudent类的方法,在执行过程中调用Student类的display.Student()方法,而该方法在执行中又会调用Person类的display.Student()方法。这真的是层层套娃了。

需要注意的是,Python有一个内置的类--object,新创建的类在不指定父类的情况下,默认派生自object类,所以上面例子中Person类的父类是object。

多态:方法重载
class Mammal():     	#哺乳类动物基类Mammal
    def show(self):     #show()方法,描述动物是什么
        print('This is a mammal.')

    def sound(self):    #sound()方法,描述动物的声音
        print('Just imagine!')

class Dog(Mammal):			#派生类Dog
    def show(self):			#方法重载
        print('This is a dog.')

    def sound(self):        #方法重载
        print('Wang Wang!')

class Cat(Mammal):			#派生类Cat
    def show(self):			#方法重载
        print('This is a cat.')

    def sound(self):        #方法重载
        print('Miao Miao~')

class Wolf(Mammal):			#派生类Wolf
    def show(self):			#方法重载
        print('This is a wolf.')
    
    def sound(self):        #方法重载
        print('Awu Awu~')

ls = [animal() for animal in (Mammal,Dog,Cat,Wolf)]
for animal in ls:
    animal.show()
    animal.sound()
    print("\n")

运行结果如下:

 

父类Mammal定义了一个方法show(),它派生的3个子类对show()方法和sound()方法进行了重载,也就是show()方法和sound()方法实现了多态。

总结

上述例子比较通俗易懂,对面向对象设计的三要素进行了简要叙述,希望能给到初学Python的同学一点启发。关于对象的属性和方法还有很多细节需要去学习。

参考资料

傅清平--《Python语言程序设计基础教程》

  • 23
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值