python学习的第十九天:类

python学习的第十九天:类

面向对象编程的四大支柱

  1. 抽象(abstraction):提取共性(定义类就是一个抽象过程,需要做数据抽象和行为抽象)。

  2. 封装(encapsulation):把数据和操作数据的函数从逻辑上组装成一个整体(对象)。

    隐藏实现细节,暴露简单的调用接口。

  3. 继承(inheritance):扩展已有的类创建新类,实现对已有类的代码复用。

  4. 多态(polymorphism):给不同的对象发出同样的消息,不同的对象执行了不同的行为。

方法重写:子类对父类已有的方法,重新给出自己的实现版本,这个过程叫做方法重写(override)。

在重写方法的过程中,不同的子类可以对父类的同一个方法给出不同的实现版本,那么该方法在运行时就会表现出多态行为。

两个类之间的关系

  1. is-a关系:继承 —> 从一个类派生出另一个类

    a student is a person

    a teacher is a person

  2. has-a关系:关联 —> 把一个类的对象作为另外一个类的对象的属性

    a person has an identity card

    a car has an engine.

  • (普通)关联
  • 强关联:整体和部分的关联,聚合和合成
  1. use-a关系:依赖 —> 一个类的对象作为另外一个类的方法的参数或返回值

    a person use a vehicle.

关于继承

  1. 继承:对已有的类进行扩展创建出新的类,这个过程就叫继承。
    提供继承信息的类叫做父类(超类、基类),得到继承信息的类称为子类(派生类)。

  2. 继承是实现代码复用的一种手段,但是千万不要滥用继承。

  3. 子类直接从父类继承公共的属性和行为,再添加自己特有的属性和行为,
    所以子类一定是比父类更强大的,任何时候都可以用子类对象去替代父类对象。

  4. Python中的继承允许多重继承,一个类可以有一个或多个父类。
    但如果不是必须使用多重继承的场景下,请尽量使用单一继承。

  5. 如果要限制一个类的对象只能拥有某些属性,可以在类中使用__slots__魔法属性

    class Student:

    slots = (‘name’, ‘gender’)

    例子:工资(月薪)结算系统

# 三类员工:
#  部门经理:固定月薪,15000元
#  程序员:计时结算月薪,每小时200元
#  销售员:底薪+提成,底薪1800元,销售额5%提成

from abc import abstractmethod


class Employee:

    def __init__(self, no, name):
        self.no = no
        self.name = name

    @abstractmethod
    def get_salary(self):
        pass


class Manager(Employee):

    def get_salary(self):
        return 15000


class Programmer(Employee):

    def __init__(self, no, name):
        super().__init__(no, name)
        self.working_hour = 0

    def get_salary(self):
        return 200 * self.working_hour


class Salesman(Employee):

    def __init__(self, no, name):
        super().__init__(no, name)
        self.sales = 0

    def get_salary(self):
        return 1800 + 0.05 * self.sales


def main():
    emps = [
        Manager(1122, '小明'), Programmer(2233, '小红'),
        Salesman(3344, '小王'), Salesman(4455, '小亮'),
        Programmer(5566, '小赵'), Salesman(6677, '小李')
    ]
    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()}元')


if __name__ == '__main__':
    main()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

踏墟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值