1、类和类之间的关系有三种:is-a、has-a和use-a关系。

is-a关系也叫继承或泛化,比如学生和人的关系、手机和电子产品的关系都属于继承关系。

has-a关系通常称之为关联,比如部门和员工的关系,汽车和引擎的关系都属于关联关系;关联关系如果是整体和部分的关联,那么我们称之为聚合关系;如果整体进一步负责了部分的生命周期(整体和部分是不可分割的,同时同在也同时消亡),那么这种就是最强的关联关系,我们称之为合成关系。

use-a关系通常称之为依赖,比如司机有一个驾驶的行为(方法),其中(的参数)使用到了汽车,那么司机和汽车的关系就是依赖关系。

利用类之间的这些关系,我们可以在已有类的基础上来完成某些操作,也可以在已有类的基础上创建新的类,

这些都是实现代码复用的重要手段。

复用现有的代码不仅可以减少开发的工作量,也有利于代码的管理和维护,这是我们在日常工作中都会使用到的技术手段。

class Person(object):

"""人"""

def __init__(self, name, age):

self._name = name

self._age = age

@property

def name(self):

return self._name

@property

def age(self):

return self._age

@age.setter

def age(self, age):

self._age = age

def play(self):

print('%s正在愉快的玩耍.' % self._name)

def watch_av(self):

if self._age >= 18:

print('%s正在观看爱情动作片.' % self._name)

else:

print('%s只能观看《熊出没》.' % self._name)

class Student(Person):

"""学生"""

def __init__(self, name, age, grade):

super().__init__(name, age)

self._grade = grade

@property

def grade(self):

return self._grade

@grade.setter

def grade(self, grade):

self._grade = grade

def study(self, course):

print('%s的%s正在学习%s.' % (self._grade, self._name, course))

class Teacher(Person):

"""老师"""

def __init__(self, name, age, title):

super().__init__(name, age)

self._title = title

@property

def title(self):

return self._title

@title.setter

def title(self, title):

self._title = title

def teach(self, course):

print('%s%s正在讲%s.' % (self._name, self._title, course))

def main():

stu = Student('王大锤', 15, '初三')

stu.study('数学')

stu.watch_av()

if __name__ == '__main__':

main()

子类在继承了父亲的方法后,可以对父类已有的方法给出新的实现版本,这个动作称之为重写(override).通过方法

重写我们可以让父类的同一个行为在子类中拥有不同的实现版本,当我们调用这个经过子类重写的方法的,不同的子类

对象会表现出不同的行为,这个就是多态(poly-morphism)

from abc import ABCMeta, abstractmethod

class Pet(object, metaclass=ABCMeta):

"""宠物"""

def __init__(self, nickname):

self._nickname = nickname

@abstractmethod

def make_voice(self):

"""发出声音"""

pass

class Dog(Pet):

"""狗"""

def make_voice(self):

print('%s:汪汪汪...' % self._nickname)

class Cat(Pet):

"""猫"""

def make_voice(self):

print('%s:喵喵' % self._nickname)

def main():

pets = [Dog('旺财'), Cat('凯蒂'), Dog('大黄')]

for pet in pets:

pet.make_voice()

if __name__ == '__main__':

main()

将Pet类处理成了一个抽象类,所谓抽象类就是不能够创建对象的类,这种类的存在就是专门为了让其他类去继承它。

Python从语法层面并没有像Java或C#那样提供对抽象类的支持,但是我们可以通过abc模块的ABCMeta元类和abstractmethod包装器来达到抽象类的效果,如果一个类中存在抽象方法那么这个类就不能够实例化(创建对象)。

上面的代码中,Dog和Cat两个子类分别对Pet类中的make_voice抽象方法进行了重写并给出了不同的实现版本,当我们在main函数中调用该方法时,这个方法就表现出了多态行为(同样的方法做了不同的事情)。

python类的继承关系,python——类和类之间的关系(继承多态)相关推荐

  1. mysql表和表的关系_mysql表与表之间建关系

    2.浪费硬盘空间 3.扩展性极差 上述的弊端产生原因类似于把代码全部写在一个py文件中,应该怎么做?  >> 解耦合! 将上述两张表拆成员工的部门两张表 分析表数据之间的关系:多个员工对应 ...

  2. Python机器学习:评价分类结果007TPR和FPR之间的关系

    TPR和FPR之间的关系 #实现混淆矩阵,精准率和召回率 import numpy as np from sklearn import datasets digits = datasets.load_ ...

  3. java c 关系_C语言和java之间的关系

    近些年来,移动互联网在全世界范围内的迅速发展,使得计算机行业也迅速发展,那c语言和java语言作为计算机语言中两种,相应的逐渐被人们了解和关注,想学习和从事c语言和java的朋友也越来越多.那同样都是 ...

  4. 二元函数连续与偏导数存在的关系_怎样理解多元函数,连续与偏导存在的关系,偏导连续之间的关系...

    展开全部 多元函数连续不是偏导存在的充分条件也不是必要条件.62616964757a686964616fe78988e69d8331333366306464 而偏导连续则是更强的条件,即偏导存在且连续 ...

  5. mysql表一对多关系,mysql表与表之间的关系(多对多,一对多)

    #创建数据库 CREATE DATABASE day15; #使用 USE day15; #创建表 CREATE TABLE test1( id INT PRIMARY KEY AUTO_INCREM ...

  6. 简述机器指令与微指令之间的关系_机器指令与微指令之间的关系是(

    [多选题]人住宾馆后,为了预防火灾事故的发生,导游人员应( ). [多选题]一般会计报表的数据来源有____. [单选题]一个n个顶点的连通无向图,其边的个数至少为( ). [单选题]选用对比剂注射参 ...

  7. cpu和内存的关系(CPU,内存和cache之间的关系)

    CPU.内存.主板三者间关系.插座形式.安装注意事项 这种问题很难回答,你可以找一本书看,呵呵 .我只能说出一点,CPU读取数据速度很慢,因为要从硬盘读取,所以用内存来读取.但是用 内存卡,段电后会丢 ...

  8. 网络中的计算机之间的关系,有关服务器与主机之间的关系

    局域网,是指"存在于某一个较小地理区域内的计算机网络".通常把两台以上的电脑通过各种介质(比如双绞线.同轴电缆.电话线等等,空气也算是一种介质,这就是无线网络)连接起来,这就构成了 ...

  9. UML类图中类与类之间的关系

    前言 在软件系统中,类不是孤立存在的,类与类之间存在相互关系,因此,需要通过 UML 来描述这些类之间的关系. 类之间具有如下几种关系: 关联关系 依赖关系 泛化关系 接口与实现关系 关联关系 含义: ...

  10. WSGI、Flask及Werkzeug三者之间的关系

    目录 一.WSGI是什么? 二.Werkzeug是什么 三.Flask的WSGI实现 一.WSGI是什么? WSGI是一套接口规范.一个WSGI程序用以接受客户端请求,传递给应用,再返回服务器的响应给 ...

最新文章

  1. java 重复start,iText中带有“start”属性的有序列表[重复]
  2. nlinfit函数 matlab,Matlab中拟合函数nlinfit和lsqcurvefit的问题
  3. Docker JFrog Artifactory 7.27.10 maven私服(IDEA 实战篇01) linux
  4. mysql collate
  5. 高通最强芯片855发布!AI性能比华为苹果翻倍,商用5G,标配屏下指纹
  6. KNN(K临近分类)算法
  7. Android:SQLiteOpenHelper数据库的两套API
  8. 复杂车间调度问题三维析取图建模系列预告
  9. win32com模块
  10. JS定义const常量对象
  11. Windows常用设置
  12. Spring MVC整合FreeMarker
  13. 数字孪生与元宇宙:数字化科技的双向融合之路
  14. 苹果笔记本装win7_m2 ngff无线网卡接口的笔记本电脑装苹果网卡
  15. 微信端自动播放背景音乐
  16. SpringSecurity之SecurityContext和Authentication对象
  17. Quantopian教程系列四
  18. 怎么关闭Windows安全启动?
  19. YesPlayMusic 0.4.0中文版:一款mac用户必备的网易云音乐客户端
  20. 3G、4G、5G有何不同之处,你真的懂吗?

热门文章

  1. Gavin小黑屋——Vue 学习笔记 :生命周期特点(先渲染HTML标签再渲染数据)
  2. vue 之 ie的 司马兼容性问题
  3. 【有机】Angew:烯基硼酸酯与烯烃的光敏性[2+2]-环加成反应
  4. greasyfork脚本怎么取消_发现 GreasyFork 有广告之后试了试几个别的脚本站
  5. 独家美食 | 只有在日本才能吃到的铁路便当
  6. i5 10500和i7 8700哪个好
  7. 【MAYA动画基础 2】Maya+AdvancedSkeleton蒙皮绑定
  8. 国内计算机专业学校排名及分数线,计算机专业考研院校排名及历年分数线
  9. springmvc框架后台Date类型字段接收数据
  10. TCP/IP模型以及网络设备