python-类与类继承

前言

刚刚接触编程的时候,我们往往按照时间顺序思考某一个问题该如何解决,采取不同的方法(函数)依次实现目标,也就是所谓的“面向过程编程”
与之不同的是,实际生活中存在大量数据本身和某一种属性或方法紧密结合的情况,比如学生的学费与学制、学校水平挂钩;工人的工资和工种、工作年限挂钩,这时为了方便管理我们可以采用一个对象(工人群体、学生群体)对应不同的属性(工种、学制)对应不同的方法(学费、工资如何计算)的方式管理数据,也就是“面向对象编程”

面向过程:以过程(或函数)为中心,强调任务的完成,通过对数据和功能的分离来解决问题。代码组织通常围绕函数和过程流。
面向对象:以对象为中心,强调通过封装数据和行为(方法)来模拟现实世界。对象是类的实例,类定义了对象的属性和方法。

实例

本例来源于B站up主:林粒粒呀

假设你管理着一家公司的工人数据库,其中有许多工人(对象),他们有姓名和工号两种属性,你希望有这样一个函数,每次调用都可以输出他们的姓名和工号;此外,工人分为全职工人和兼职工人,你希望还有一个函数,每次调用可以输出工人的月薪:全职工人按月发薪,兼职工人按日发薪,最终都以月薪的形式展现

我们可以使用class关键字定义一个Worker类:
该类下面的每一个对象具有姓名和工号两个自身属性

name和work_id是我们调用Worker类时从外部传入的变量,要注意给到self.name和self.work_id下使之成为类下属对象的自身属性, __init__函数是构造函数,必须要有self参数
print_info方法可以查看工人的姓名和工号

class Worker:
    def __init__(self, name, work_id):  # 名字好像只能是字符串
        self.name = name
        self.work_id = work_id

    def print_info(self):
        print(f"姓名:{self.name} 工号:{self.work_id}")

再进一步,分全职工人和兼职工人,他们对应着不同的薪资计算方法
FT是Full-time的简写, PT是Part-time的简写
这里可以用到类继承,无论是全职还是兼职工人,都是工人(父类)的子类,所以工号和姓名这两个属性以及打印工号和姓名的函数(print_info)可以直接从Worker类下面继承,只需要在各自类名后的括号里放入父类名Worker,并调用super()初始化继承自父类的两个属性就可以了。

我们希望得到全职工人和兼职工人各自的月薪计算方法

由于全职工人本来就按月发薪,所以直接把monthly_salary传给FTWorker类,再定义一个函数calculate_monthly_pay_FT返回monthly_salary就可以了,最后定义一下print_info_FT函数,格式化输出姓名、工号和月收入

class FTWorker(Worker):
    def __init__(self, name, work_id, monthly_salary):
        super().__init__(name, work_id)
        self.monthly_salary = monthly_salary

    def calculate_monthly_pay_FT(self):
        return self.monthly_salary  # 如果不返回任何值就会出现None

    def print_info_FT(self):
        print(f"{self.name}(工号{self.work_id})的月收入是{self.monthly_salary}")

兼职工人按日发薪,所以想知道月薪需要加上工作时长work_time参数,再把两者相乘的结果传给PT_salary变量并返回,类似的,我们也定义一个print_info_PT函数格式化输出姓名、工号和月收入即可,至此两个子类都已经封装好了

class PTWorker(Worker):
    def __init__(self, name, work_id, daily_salary, work_time):
        super().__init__(name, work_id)
        self.daily_salary = daily_salary
        self.work_time = work_time

    def calculate_monthly_pay_PT(self):
        PT_salary = self.work_time * self.daily_salary
        return PT_salary

    def print_info_PT(self):
        print(f"{self.name}(工号{self.work_id})的月收入是{self.work_time * self.daily_salary}")

向类中添加对象

参数不要传漏了,兼职工人有一个工时

lin = PTWorker("lzy", 34, 500, 8)
zeng = FTWorker("zcy", 1, 8000)
lyf = PTWorker("lyf", 9, 100, 14)

最后调用类下的方法,看看结果

lin.print_info()
lin.print_info_PT()
zeng.print_info()
zeng.print_info_FT()
lyf.print_info()
lyf.print_info_PT()

结果

image.png
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 第2章 编写简单的查询语句 练习11.使用两种方式查询所有员工(EMP)信息。2.查询(EMP)员工编号、员工姓名...
    zwwws阅读 10,472评论 0 0
  • 一、继承 1:描述一个学生类:姓名年龄学号属性,学习的方法2:描述一个工人类:姓名年龄工号属性,工作的方法3:描述...
    Binary_r阅读 1,801评论 0 1
  • 1.1 类与类之间常见关系 1.1.1现实生活的整体与部分 举例说明 现实生活 1:学生 是人 2:狗 是动物 ...
    加菲猫智慧猪阅读 1,756评论 0 0
  • 我们已经了解了C++面向对象的编程思想。现在我们利用多态的技术,来实现一个职工管理系统,对这些知识加以巩固和提升。...
    殷超锋阅读 2,325评论 3 2
  • 在这一节,结合之前学过的内容,我们来看如何在Python中表示类之间的继承关系。 首先,基于上一节的例子,我们创建...
    醉看红尘这场梦阅读 3,169评论 0 0

友情链接更多精彩内容