运用面向对象写一个分数类:
“”"
example01 - 分数类
x, y
y % x == 0 —> 成立:返回x
—> 不成立:找 y % x, x 的最大公约数
def gcd(x, y):
"""求最大公约数"""
while y % x != 0:
x, y = y % x, x
return x
class Fraction:
def __init__(self, num, den):
self.num = num
self.den = den
self.normalize()
self.simplify()
def __str__(self):
if self.den == 1:
return f'{self.num}'
return f'{self.num}/{self.den}'
def __add__(self, other):
"""加法"""
num = self.num * other.den + other.num * self.den
den = self.den * other.den
return Fraction(num, den)
def __sub__(self, other):
"""减法"""
num = self.num * other.den - other.num * self.den
den = self.den * other.den
return Fraction(num, den)
def __mul__(self, other):
"""乘法"""
num = self.num * other.num
den = self.den * other.den
return Fraction(num, den)
def __truediv__(self, other):
"""除法"""
num = self.num * other.den
den = self.den * other.num
return Fraction(num, den)
def simplify(self):
"""化简"""
if self.num != 0:
factor = gcd(abs(self.num), abs(self.den))
self.num, self.den = self.num // factor, self.den // factor
return self
def normalize(self):
"""规范化"""
if self.num == 0:
self.den = 1
elif self.den < 0:
self.num = -self.num
self.den = -self.den
return self
f1 = Fraction(-6, -9)
print('f1', f1)
f2 = Fraction(3, -4)
print('f2', f2)
f3 = f1 * f2
print('f3', f3)
f4 = Fraction(11, 19)
print('f4', f4)
print(f1 + f2 - f3)
print((f1 + f2) * f3 / f4)
2.example06 - 工资(月薪)结算系统
-
公司有三类员工,结算月薪的方式是不一样的:
- 部门经理 —> 15000元 / 月
- 程序员 —> 计算工时 —> 200元 / 小时 * 本月工时
- 销售员 —> 底薪+提成 —> 1800元 + 本月销售额5%提成
给出员工的信息,自动结算月薪。
"""
override ---> 重写 / 覆盖 / 置换 ---> 子类将父类已有的方法重新实现一遍
子类可以重写父类的方法,不同的子类可以对同一个方法给出不同的实现版本
多态 - 不同的对象(部门经理、销售员、程序员)接收到相同的消息(get_salary)做了不同的事情(每种员工结算月薪的方式都不一样)
"""
from abc import ABCMeta, abstractmethod
class Employee(metaclass=ABCMeta):
def __init__(self, name):
self.name = name
@abstractmethod
def get_salary(self):
pass
class Manager(Employee):
def get_salary(self):
return 15000.0
class Programmer(Employee):
def __init__(self, name):
super().__init__(name)
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
def get_salary(self):
return 1800.0 + self.sales * 0.05
def main():
emps = [
Manager('曹操'), Programmer('荀彧'), Programmer('郭嘉'),
Salesman('典韦'), Salesman('曹仁'), Programmer('李典')
]
for emp in emps:
if type(emp) == Programmer:
emp.working_hour = int(input(f'请输入{emp.name}本月工作时间: '))
elif type(emp) == Salesman:
emp.sales = float(input(f'请输入{emp.name}本月销售额: '))
print(f'{emp.name}本月工资为: {emp.get_salary():.2f}元')
if __name__ == '__main__':
main()