Python入门学习篇(十七)——封装、继承、多态

news/2024/7/3 12:26:45 标签: python, 入门学习, 封装, 继承, 多态

1 封装

1.1 理解

属性和方法书写到类里面的操作即为封装
封装可以理解成私有化属性和私有化方法

1.2 示例代码

python">class Person():
    p_num = 0  # 用于统计数量

    def __init__(self, name, age, sex, job):
        # __name为私有化属性
        self.__name = name
        self.age = age
        self.sex = sex
        self.job = job

    # 调用私有化属性的方法
    def get_name(self):
        return self.__name

    # 修改私有化属性的方法
    def set_name(self, name):
        self.__name = name

    def eat(self):
        print("吃饭")

    # 私有化方法
    def __sleep(self):
        print("睡觉")

    # 通过公开方法简介调用私有化方法
    def show_sleep(self):
        self.__sleep()


chinese_teacher = Person("张三", 24, "男", "语文老师")
print(f"name的值为: {chinese_teacher.get_name()}")
chinese_teacher.show_sleep()

1.3 运行截图

在这里插入图片描述

2 继承

2.1 理解

子类可以继承父类的所有非私有属性和方法
为了使代码更加简洁

2.2 分类

2.2.1 常规继承

a 语法

python">class 类A():
    # 类A的属性和方法
class 类B(类A):
    # 类B的属性和方法
# 注意: 类B中拥有类A的所有非私有属性和非私有方法

b 示例代码

python">class Animal():
    def __init__(self, name, sex, age):
        print("父类的构造方法")
        self.name = name
        self.sex = sex
        self.__age = age

    def get_age(self):
        return self.__age

    def set_age(self, age):
        self.__age = age

    def behavior(self):
        print("动物的叫声")


class Cat(Animal):
    def __init__(self, name, sex, age):
        print("子类的构造方法")
        # 调用父类的构造方法
        super().__init__(name, sex, age)

    # 当子类重写父类的方法时,子类实例化对象调用的是自己的方法
    def behavior(self):
        print("喵喵喵")


cat = Cat("小金", "雄性", 5)
cat.behavior()

c 运行截图

在这里插入图片描述

2.2.2 继承传递

a 语法

python">class 类A():
    # 类A的属性和方法
class 类B(类A):
    # 类B的属性和方法
class 类c(类B):
    # 类c的属性和方法
# 注意: 类B中拥有类A的所有非私有属性和非私有方法
# 注意: 类C中拥有类A的所有非私有属性和非私有方法、类B的所有非私有属性和非私有方法
# 实际上可以理解为类C继承了类B中拥有的所有非私有属性和非私有方法(包含类B自己继承的)

b 示例代码

python">class Animal():
    def __init__(self, name, sex, age):
        print("父类的构造方法")
        self.name = name
        self.sex = sex
        self.__age = age

    def get_age(self):
        return self.__age

    def set_age(self, age):
        self.__age = age

    def behavior(self):
        print("动物的叫声")

    def __str__(self):
        return f"姓名为: {self.name},性别为:{self.sex},年龄为:{self.__age}"

    def describe(self):
        return self.__str__()


class Cat(Animal):
    num = 0  # 数量

    def __init__(self, name, sex, age):
        print("子类的构造方法")
        # 调用父类的构造方法
        super().__init__(name, sex, age)
        self.num += 1

    # 当子类重写父类的方法时,子类实例化对象调用的是自己的方法
    def behavior(self):
        print("喵喵喵")


# DragonLi是狸花猫的意思
class DragonLi(Cat):
    def __init__(self, name, sex, age):
        print("孙类的构造方法")
        # 调用父类的构造方法
        super().__init__(name, sex, age)
    def behavior(self):
        print("出去玩耍了")


cat = DragonLi("小金", "雄性", 5)
print("修改前: ", cat.describe())
cat.set_age(6)
print("修改后: ", cat.describe())
cat.behavior()
print("当前猫的数量为:", cat.num)

c 运行截图

在这里插入图片描述

2.2.3 多继承(继承多个不同父类)

a 语法

python">class 类A():
    # 类A的属性和方法
class 类B():
    # 类B的属性和方法
class 类C(类A,类B):
    # 类C的属性和方法
# ①当类A和类B存在同名方法时,类C调用时采用就近原则,即类c定义的括号中,哪个类在前面就调用哪个类的方法 
#   例如 class 类C(类A,类B)时,调用的就是类A中的同名方法 
# ②当类A、类B、类C均存在同名方法时,类c实例化对象调用时,调用的是类C自己的方法
# ③类c中含有类A、类B的所有非私有属性和非私有方法

b 示例代码

python">class Animal():
    def __init__(self, name, sex, age):
        print("父类的构造方法")
        self.name = name
        self.sex = sex
        self.__age = age

    def get_age(self):
        return self.__age

    def set_age(self, age):
        self.__age = age

    def behavior(self):
        print("动物的叫声")

    def __str__(self):
        return f"姓名为: {self.name},性别为:{self.sex},年龄为:{self.__age}"

    def describe(self):
        return self.__str__()
    def eat_food(self):
        print("以有机物为食")
class Fly():
    # tool是代表飞翔的工具
    def __init__(self,tool):
        self.tool=tool

    def behavior(self):
        print("芜湖起飞")
    def fly_reason(self):
        print("符合空气动力学原理")


class Bird(Animal,Fly):
    num = 0  # 数量

    def __init__(self, name, sex, age):
        print("子类的构造方法")
        # 调用父类的构造方法
        super().__init__(name, sex, age)
        self.num += 1

    # # 当子类重写父类的方法时,子类实例化对象调用的是自己的方法
    # def behavior(self):
    #     print("叽叽喳喳")



bird = Bird("小红", "雄性", 5)
print("修改前: ", bird.describe())
bird.set_age(6)
print("修改后: ", bird.describe())
# 调用的是Animal父类中的behavior方法
bird.behavior()
bird.eat_food()
bird.fly_reason()

c 运行截图

在这里插入图片描述

3 多态

3.1 语法

python">对象=父类(子类实例化对象)
# 多态的实现步骤如下所示:
#   ①定义父类,并提供公共方法
#   ②定义子类,并重写父类方法
#   ③传递子类对象给调用者,可以看到不同子类执行效果不同

3.2 示例代码

python"># 一户人家养了两只不同的品种的猫,一只是狸花猫,一只是橘猫,狸花猫喜欢出去打架、橘猫喜欢干饭
class Cat():
    def __init__(self, name, sex):
        self.name = name
        self.sex = sex

    def behavior(self):
        print("猫的行为")


# 狸花猫
class DragonLi(Cat):
    def __init__(self, name, sex):
        super().__init__(name, sex)

    def behavior(self):
        print(f"品种为狸花猫的{self.name}喜欢出去打架")


# 橘猫
class OrangeCat(Cat):
    def __init__(self, name, sex):
        super().__init__(name, sex)

    def behavior(self):
        print(f"品种为橘猫的{self.name}喜欢干饭")


class Person():
    # 发现猫的行为特点,根据传入的不同的obj对象,调用不同的方法
    def search_attitude(self, obj):
        obj.behavior()


d = DragonLi("小花", "雄性")
o = OrangeCat("小黄", "雌性")
p = Person()
p.search_attitude(d)
p.search_attitude(o)

3.3 运行截图

在这里插入图片描述


http://www.niftyadmin.cn/n/5301679.html

相关文章

Unity Hub 无法激活许可证

烦死了~ 😵‍💫 卸载UnityHub, 安装旧版本👈激活许可证, 如果出现旧版本无法识别Editor的情况需要卸载了再装最新版本的UnityHub

QCustomPlot(一)设置环境

1 设置QCustomPlot环境 将QCustomPlot与你的应用程序配合使用非常简单: 从下载部分获取最新版本的QCustomPlot。 像使用其他普通的类文件一样,使用qcustomplot.h和qcustomplot.cpp文件。 1.1 QtCreator用户 在左侧边栏中右键单击项目的根目录条目&a…

【Manacher】LeetCode-5. 最长回文子串

5. 最长回文子串。 给你一个字符串 s,找到 s 中最长的回文子串。 如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。 示例 1: 输入:s "babad" 输出:"bab" 解释:"…

Altium Designer各版本安装指南

Altium Designer下载链接 https://pan.baidu.com/s/1m8croTPOak-n80sHCKCPAw?pwd0531 1.鼠标右击【Altium Designer 23(64bit)】压缩包(win11系统需先点击显示“更多选项”)选择【解压到 Altium Designer 23(64bit)】。 2.打开解压后的文件夹&#xf…

文件属性信息

文件的属性信息 Linux是一个基于文件的操作系统,因此作为文件本身也就有很多属性,如果想要查看某一个文件的属性有两种方式:命令和函数。虽然有两种方式但是它们对应的名字是相同的,叫做stat。另外使用file命令也可以查看文件的一…

java实现大文件分片上传

背景: 公司后台管理系统有个需求,需要上传体积比较大的文件:500M-1024M;此时普通的文件上传显然有些吃力了,加上我司服务器配置本就不高,带宽也不大,所以必须考虑多线程异步上传来提…

复试 || 就业day03(2024.01.03)项目一

文章目录 前言scikit-learn实现简单线性回归scikit-learn实现多元线性回归(二元)总结 前言 💫你好,我是辰chen,本文旨在准备考研复试或就业 💫本文内容来自某机构网课,是我为复试准备的第一个项…

代码随想录第三十八天——斐波拉契数列,爬楼梯,使用最小花费爬楼梯

动态规划基础 动态规划中每一个状态一定是由上一个状态推导出来的 动态规划的解题步骤可以拆解为如下五步: 确定dp数组(dp table)以及下标的含义确定递推公式dp数组如何初始化确定遍历顺序举例推导dp数组 leetcode 509. 斐波拉契数列 题目…