python面向对象编程续篇
工资结算系统
公司有三类员工,结算月薪的方式不一样
一部门经理:15000元
二 程序员 --》计算工时 ----》200元/小时
三销售员 ---》底薪+提成 --》1800元+本月销售额5%的提成
多态:不同的对象接收到了相同的信息但是做了不同的事情
要实现多态,最终的是方法的重写,即子类重写父类的方法,不同的子类给出了不同的实现种类的方式,所以这个方法在运行的时候就会表现出多态,做的事情是不一样的
# 定义抽象类:
from abc import ABCMeta, abstractclassmethod
class Employee(metaclass=ABCMeta): # jiang Employee定义成一个抽象类
def __init__(self, name):
self.name = name
@abstractclassmethod # 抽象方法,告诉子类一定要创建这个抽象方法
def get_salary(self):
pass
class Manager(Employee):
def __init__(self, name):
super().__init__(name)
# 默认工作时间是0,在创建完对象之后给对象发消息的时候可以重新给下面的变量进行赋值
self.working_hour = 0
def get_salary(self):
return 200 * self.working_hour
class Salesman(Employee):
def __init__(self, name):
super().__init__(name)
self.sales = 0.0 # 默认销售额是0,正在创建完对象之后给对象发消息的时候可以重新给变量进行赋值
def get_salary(self):
return 1800 + self.sales * 0.05
def main():
emps = [Manager('小明'), Programmer('小红')]
for emp in emps:
if type(emp) == Programmer:
emp.working_hour = int(input(f'{emp.name}本月的工作时间是:'))
elif type(emp) == Salesman:
emp.sales = int(input(f'{emp.name}本月的销售额是:'))
print(f'{emp.name}本月的工资是:{emp.get_salary()}')
if __name__ == '__main__':
main()
override -重写,覆盖,置换---》子类将父类已有的方法进行重写
定义类,描述一个分数
# 定义一个函数求解两个数的最大公约数
def gcb(x, y):
while y % x:
x, y = y % x, x
return x
# 自定义异常错误类型
class FractionException(Exception):
pass
class Fraction:
# 利用类方法将字符串转换成分数
@classmethod
def from_string(cls, string:str):
# 类方法在调用的时候需要使用类名.方法名来实现
items = string.split('/')
num, den = [int(item.strip()) for item in items]
return cls(num, den)
# 利用类方法将小数转换成分数
@classmethod
def from_value(cls, value:float, base=100):
return cls(value * base, base)
def __init__(self, num, den):
# 自定义错误类型
if den == 0:
raise FractionException('0不能是分母')
self.num = num
self.den = den
self.normalize()
self.simplify()
def __str__(self):
if self.num == 0 or self.den == 1:
return f'{self.num}'
return f'{self.num}/{self.den}'
def add(self, other):
"""分数加法运算"""
num = self.num * other.den + self.den * other.num
den = self.den * other.den
return Fraction(num, den)
def sub(self, other):
"""分数减法运算"""
num = self.num * other.den - self.den * other.num
den = self.den * other.den
return Fraction(num, den)
def mul(self, other):
"""分数乘法运算"""
return Fraction(self.num * other.num, self.den * other.den)
def div(self, other):
"""分数除法运算"""
return Fraction(self.num * other.den, self.den * other.num)
# 将分数转换成小数
def value(self):
return self.num / self.den
def normalize(self):
"""规范化"""
if self.den < 0:
self.num = -self.num
self.den = -self.den
return self
def simplify(self):
"""化简"""
if self.num != 0:
x, y = abs(self.num), abs(self.den)
f = gcb(x, y)
self.num, self.den = self.num // f, self.den // f
return self
f1 = Fraction(3, 4)
f2 = Fraction(1, 4)
print(f1.add(f2)) # 1
异常状况处理
代码本身即使没有任何问题,但在运行的时候可能因为外部环境或资源的问题,导致代码无法运行,程序出现异常状况,如果异常状况没有得到处理,那么程序就会奔溃,具体表现就是代码直接停止运行,如果不希望程序奔溃,就有对代码进行异常状况的处理,在Python中,可以使用try语法将可能出现状况的代码保护起来执行,在出现状况的时候,使用except进行异常状况的捕获并给出相应的处理
import sys
import time
while True:
try:
# 将可能出状况的代码保护执行
with open('readme.txt') as file:
print(file.read())
break
# 进行异常捕获(如果文件找不到,下方代码就会进行异常捕获,并且只会执行一个except)
except FileNotFoundError:
print('错误提示,文件不存在,5秒以后尝试重新读取')
time.sleep(5)
except IOError:
print('错误提示:读取文件失败,请确认设备是否就绪')
sys.exit(1) # 1秒后系统关闭python解释器,程序自动退出
except Exception:
print('错误提示:程序发生未知错误,请拨打售后热线!')
sys.exit(1)
finally:
# 不管有没有异常,finally代码都会执行,用来释放外部资源(例如断开网络连接,断开数据库连接)
print('!!!!!!!!!!!!!!')