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()