运用面向对象写一个分数类:

该博客介绍了如何使用面向对象编程方法创建一个分数类,包括处理分数的逻辑,如检查分子和分母的最大公约数。此外,还提到了一个2.example06 - 工资(月薪)结算系统的例子,该系统能根据员工信息自动进行月薪结算。
摘要由CSDN通过智能技术生成

运用面向对象写一个分数类:

“”"
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()
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值