类和类/对象和对象之间的三大关系

本文探讨了Python中类与类之间、对象与对象之间的三大关系:关联(如has-a的强关联/聚合)、使用(use-a,依赖关系)和继承(is-a)。虽然Python不直接支持抽象类,但可通过abc模块实现类似效果,声明抽象类并定义抽象方法,要求子类重写。
摘要由CSDN通过智能技术生成

线段上有两个点 - has-a - 关联关系 整体不可分割的,叫做强关联/聚合 eg:人有手,车有引擎

人使用了房子 - use-a - 使用,依赖关系

学生是人 - is-a - 继承关系

继承 - 从已经有的类创建新类的过程
提供继承信息的称为父类(超类/基类)
得到继承信息的称为子类(派生类/衍生类)
通过继承我们可以将子类中的重复代码抽取到父类中
子类通过继承并复用这些代码来减少重复代码的编写
将来如果要维护子类的公共代码只需要在父类中进行操作即可
class Person(object):

    def __init__(self,name,age):
        self._name = name 
        self._age = age

    @property  # getter - 属性访问器
    def name(self):
        return self._name

    @property
    def age(self):
        return self._age

    @age.setter  # setter - 属性修改器
    def age(self,age):
        self._age = age

    def watch_av(self):
        print('%s正在看片' % self._name)

class Student(Person):

    def __init__(self, name, age):
        super().__init__(name,age)  # 从父类Person继承属性name,age
        self._course = course

    @property
    def course(self):
        return self._course

    @course.setter
    def study(self,course):
        return '%s正在学习%s' % (self._name, course)

    # 方法重写(override) - 覆盖/置换/重写  
    # 子类在继承父类方法之后,对方法进行了重新实现
    # 当我们给子类对象发送watch_av消息时执行的是子类重写过的方法
    def watch_av(self):
        print('学生正在跟苍老师学习技术')

def main():
    stu1 = Student('李牧',40)
    stu2 = Student('钟岳',17)
    stu1.study('HTML网页设计')
    stu2.watch_av()

if __name__ == '__main__':
    main()

Python没有从语言层面支持抽象类的概念,我们可以通过abc模块来制造抽象类的效果

在定义类的时候通过指定metaclass=ABCMeta可以将类声明为抽象类

抽象类是不能创建对象的,抽象类存在的意义是专门给其他类继承

abc模块中还有一个包装器abstractmethod,通过这个包装器可以将方法包装为抽象方法,必须要求子类进行重写

from abc import ABCMeta,abstramethod

class Employee(object,metaclass=ABCMeta):
    '''员工'''

    def __init__(self,name):
        '''初始化方法'''
        self._name = name

    @property
    def name(self):
        return self._name

    @abstractemethod
    def get_salary(self):
        '''获得月薪...'''
        pass

class Manager(Employee):

    def get_salary(self):
        return 15000.00

class Programmer(Employee):

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

    @property
    def working_hour(self):
        return self._working_hour

    @working_hour.setter
    def working_hour(self,working_hour):
        self._working_hour = working_hour if working_hour > 0 else 0

    def get_salary(self):
        return 150.0 * self._working_hour

class Salesman(Employee):

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

    @property
    def sales(self):
        return self._sales

    @sales.setter
    def sales(self,sales):
        self._sales = sales if sales > 0 else 0

    def get_salary(self):
        return 1200.0 + self._sales * 0.05

def main():
    emps = [
        Manager('猴子'), Programmer('罗刹'),
        Manager('龙女'), Salesman('狐狸'),
        Salesman('牛魔'), Programmer('神将'),
        Programmer('和尚')
    ]
    for emp in emps:
        # isinstance判定一个对象是不是指定的类型
        if isinstance(emp, Programmer):
            emp.working_hour = int(input('请输入%s本月工作时间:' % emp.name))
        elif isinstance(emp,Salesman):
            emp.sales = float(input('请输入%s本月销售额:' % emp.name))
        # 同样是接收get_salary这个消息,但是不同的员工表现出了不同的行为
        # 因为三个子类都重写了get_salary方法,所以这个方法会表现出多态行为
        print('%s本月工资为: ¥%.2f元' % (emp.name,emp.get_salary()))


if __name__ == '__main__':
    main()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值