牛骨文教育服务平台(让学习变的简单)
博文笔记

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

创建时间:2018-10-13 投稿人: 浏览次数:264

线段上有两个点 - 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()

声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。