Python面向对象三大特性

这是我参与更文挑战的第 24 天,活动详情查看: 更文挑战

1. 概述

Python 是面向对象的语言,也支持面向对象编程的三大特性:继承、封装(隐藏)、多态

面向对象三大特征

封装(隐藏)
隐藏对象的属性和实现细节,只对外提供必要的方法。相当于将“细节封装起来”,只对外暴露“相关调用方法”
通过前面学习的私有属性、私有方法的方式,实现“封装”。Python追求简洁的语法,没有严格的语法级别的访问控制符,更多的是依靠程序猿自觉实现

继承
继承可以让子类具有父类的特性,提高了代码的重用性
从设计上是一种增量进化,原有父类设计不变的情况下,可以增加新的功能,或者改进已有的算法。

多态
多态是指同一个方法调用由于对象不同会产生不同的行为,生活中这样的例子比比皆是:同样是休息方法,人不同休息方法不同,比如小米休息是睡觉,小兵休息是玩游戏,小王休息是敲几行代码

2. 封装

2.1 封装介绍

封装指的是将对象的状态信息隐藏在对象内部,不允许外部程序直接访问对象内部信息,而是通过该类所提供的方法来实现对内部的操作和访问。

封装本质是一个种黑盒方式对于外界。只用对外界提供可以使用的接口,而不用关心其内部实现。

2.2 封装实操
class Animal:


    def __init__(self):
        self.__name = 'Tom'  # 私有属性
        self.age = 3   #普通属性


    def __get_name(self):  ##私有方法
        print("名字是{0}".format(self.__name))


    def get_age(self):  #普通方法,可以调用私有属性和方法
        print("{0} 的年龄是{1}岁".format(self.__name,self.age))


cat = Animal()
cat.get_age()   #调用get_age()
cat._Animal__get_name()
复制代码

封装运行结果

3. 继承

3.1 继承介绍

继承是面向对象程序设计的重要特征,也是实现代码复用的重要手段

如果一个新类继承自一个设计好的类,就直接具备了已有类的特征,就大大降低了工作难度。已有的类,我们称为父类或者基类,新的类,我们称为子类或者派生类。

Python支持多重继承,一个子类可以继承多个父类,继承的语法格式如下:

class 子类类名(父类1[,父类2,...]):
    类体
复制代码

继承示例图

如果在类定义中没有指定父类,则默认父类是object类

Object是所有类的父类,里面定义了一些所有类共有的默认实现

定义子类时,必须在其构造函数中调用父类构造函数,格式为:父类名.init(self,参数列表)

子类重写了构造函数,则创建实例对象时,只会调用子类的构造函数,父类构造函数不再被使用

3.2 继承实操
class Person:

    def __init__(self, name):
        self.name = name

    def say_name(self):
        print("名字是:{0}".format(self.name))


class Student(Person):

    def __init__(self, name, age):
        Person.__init__(self, name)  # 使用父类的构造函数
        self.age = age


# Student->person->object类
print(Student.mro())

S1 = Student("Juejing", 24)  # 创建实例对象S1
S1.say_name()
复制代码

继承运行结果

4. 多态

4.1 多态介绍

多态是指向同一个方法调用由于对象不同可能产生不同的行为。

  1. 多态是方法的多态,属于没有多态
  2. 多态的存在有2个必要条件:继承和方法重写
4.2 多态实操
class Animal:


    def eat_food(self):
        print("投喂时间到了,开始进食")

class Dog(Animal):     # 子类

    def eat_food(self):
        print("投喂时间到了,喜欢吃meat")


class Pig(Animal):   # 子类

    def eat_food(self):
        print("投喂时间到了,喜欢吃Rice")


class Cat(Animal):   # 子类

    def eat_food(self):
        print("投喂时间到了,喜欢吃fish")
 
def animalEat(a):    # 定义一个方法animalEat

    if isinstance(a,Animal):
        a.eat_food()    #一个方法,根据对象的不同,调用不同的方法
    else:
        print("没到时间,等待")

Cat = Cat()
animalEat(Cat)

Dog = Dog()
animalEat(Dog)

复制代码

多态运行结果

总结

本期我们学习了面向对象的三个特征,了解和掌握了它们的基本概念及使用方法。

封装,使用私有属性和私有方法把细节隐藏起来,提高代码的可维护性

继承,子类继承父类,提高代码的复用率,减少冗余代码出现

多态,子类继承父类后,由于子类的需求重写父类的方法,适用在不同对象上变现不一样。

好啦,以上是本期的内容,欢迎大佬们评论区指正,下次见~