Python面向对象之继承和组合用法实例分析


Posted in Python onAugust 27, 2018

本文实例讲述了Python面向对象之继承和组合用法。分享给大家供大家参考,具体如下:

面向对象的组合用法

软件重用的重要方式除了继承之外还有另外一种方式,即:组合

组合指的是,在一个类中以另外一个类的对象作为数据属性,称为类的组合

圆环是由两个圆组成的,圆环的面积是外面圆的面积减去内部圆的面积。圆环的周长是内部圆的周长加上外部圆的周长。

这个时候,我们就首先实现一个圆形类,计算一个圆的周长和面积。然后在"环形类"中组合圆形的实例作为自己的属性来用

# -*-coding:utf-8 -*-
#! python3
from math import pi
class Circle:
  '''
  定义了一个圆形类;
  提供计算面积(area)和周长(perimeter)的方法
  '''
  def __init__(self,radius):
    self.radius = radius
  def area(self):
    return pi * self.radius * self.radius
  def perimeter(self):
    return 2 * pi *self.radius
circle = Circle(10) #实例化一个圆
area1 = circle.area() #计算圆面积
per1 = circle.perimeter() #计算圆周长
print(area1,per1) #打印圆面积和周长
class Ring:
  '''
  定义了一个圆环类
  提供圆环的面积和周长的方法
  '''
  def __init__(self,radius_outside,radius_inside):
    self.outsid_circle = Circle(radius_outside)
    self.inside_circle = Circle(radius_inside)
  def area(self):
    return self.outsid_circle.area() - self.inside_circle.area()
  def perimeter(self):
    return self.outsid_circle.perimeter() + self.inside_circle.perimeter()
ring = Ring(10,5) #实例化一个环形
print(ring.perimeter()) #计算环形的周长
print(ring.area()) #计算环形的面积

运行结果:

314.1592653589793 62.83185307179586
94.24777960769379
235.61944901923448

继承

继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类

python中类的继承分为:单继承和多继承

查看继承

>>> SubClass1.__bases__ #__base__只查看从左到右继承的第一个子类,__bases__则是查看所有继承的父类
(<class '__main__.ParentClass1'>,)
>>> SubClass2.__bases__
(<class '__main__.ParentClass1'>, <class '__main__.ParentClass2'>)

提示:如果没有指定基类,python的类会默认继承object类,object是所有python类的基类,它提供了一些常见方法(如__str__)的实现。

>>> ParentClass1.__bases__
(<class 'object'>,)
>>> ParentClass2.__bases__
(<class 'object'>,)

继承与抽象(先抽象再继承)

抽象即抽取类似或者说比较像的部分。

抽象分成两个层次:

1.将奥巴马和梅西这俩对象比较像的部分抽取成类;

2.将人,猪,狗这三个类比较像的部分抽取成父类。

抽象最主要的作用是划分类别(可以隔离关注点,降低复杂度)

继承:是基于抽象的结果,通过编程语言去实现它,肯定是先经历抽象这个过程,才能通过继承的方式去表达出抽象的结构。

抽象只是分析和设计的过程中,一个动作或者说一种技巧,通过抽象可以得到类

继承与重用性

在开发程序的过程中,如果我们定义了一个类A,然后又想新建立另外一个类B,但是类B的大部分内容与类A的相同时

我们不可能从头开始写一个类B,这就用到了类的继承的概念。

通过继承的方式新建类B,让B继承A,B会‘遗传'A的所有属性(数据属性和函数属性),实现代码重用

派生

当然子类也可以添加自己新的属性或者在自己这里重新定义这些属性(不会影响到父类),需要注意的是,一旦重新定义了自己的属性且与父类重名,那么调用新增的属性时,就以自己为准了。

在子类中,新建的重名的函数属性,在编辑函数内功能的时候,有可能需要重用父类中重名的那个函数功能,应该是用调用普通函数的方式,即:类名.func(),此时就与调用普通函数无异了,因此即便是self参数也要为其传值.

在python3中,子类执行父类的方法也可以直接用super方法.

# -*-coding:utf-8 -*-
#! python3
class A:
  def hahaha(self):
    print('A')
class B(A):
  def hahaha(self):
    super().hahaha()
    #super(B,self).hahaha()
    #A.hahaha(self)
    print('B')
a = A()
b = B()
b.hahaha()
super(B,b).hahaha()

运行结果:

A
B
A

通过继承建立了派生类与基类之间的关系,它是一种'是'的关系,比如白马是马,人是动物。

当类之间有很多相同的功能,提取这些共同的功能做成基类,用继承比较好,比如教授是老师

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
python网络编程学习笔记(六):Web客户端访问
Jun 09 Python
Python通过90行代码搭建一个音乐搜索工具
Jul 29 Python
再谈Python中的字符串与字符编码(推荐)
Dec 14 Python
python 读写中文json的实例详解
Oct 29 Python
python 实现数组list 添加、修改、删除的方法
Apr 04 Python
Python父目录、子目录的相互调用方法
Feb 16 Python
Python 2/3下处理cjk编码的zip文件的方法
Apr 26 Python
[机器视觉]使用python自动识别验证码详解
May 16 Python
Python3内置模块pprint让打印比print更美观详解
Jun 02 Python
pytorch点乘与叉乘示例讲解
Dec 27 Python
在Python中用GDAL实现矢量对栅格的切割实例
Mar 11 Python
python构造IP报文实例
May 05 Python
Python干货:分享Python绘制六种可视化图表
Aug 27 #Python
python使用matplotlib库生成随机漫步图
Aug 27 #Python
Python面向对象之接口、抽象类与多态详解
Aug 27 #Python
python实现随机漫步算法
Aug 27 #Python
Python3随机漫步生成数据并绘制
Aug 27 #Python
python如何生成各种随机分布图
Aug 27 #Python
python随机数分布random测试
Aug 27 #Python
You might like
PHP3 safe_mode 失效漏洞
2006/10/09 PHP
php session应用实例 登录验证
2009/03/16 PHP
PHP数组及条件,循环语句学习
2012/11/11 PHP
YII框架实现自定义第三方扩展操作示例
2019/04/26 PHP
javascript据option的value值快速设定初始的selected选项
2007/08/13 Javascript
jQuery 过滤not()与filter()实例代码
2012/05/10 Javascript
多个表单中如何获得这个文件上传的网址实现js代码
2013/03/25 Javascript
jQuery进行组件开发完整实例
2015/12/15 Javascript
AngularJS进行性能调优的7个建议
2015/12/28 Javascript
Bootstrap幻灯片轮播图支持触屏左右手势滑动的实现方法
2016/10/13 Javascript
jQuery实现手势解锁密码特效
2017/08/14 jQuery
gulp安装以及打包合并的方法教程
2017/11/19 Javascript
解决微信小程序防止无法回到主页的问题
2018/09/28 Javascript
写gulp遇到的ES6问题详解
2018/12/03 Javascript
express框架中使用jwt实现验证的方法
2019/08/25 Javascript
es6数组includes()用法实例分析
2020/04/18 Javascript
使用JavaScript实现贪吃蛇游戏
2020/09/29 Javascript
node.js爬虫框架node-crawler初体验
2020/10/29 Javascript
详解Django缓存处理中Vary头部的使用
2015/07/24 Python
python编程实现随机生成多个椭圆实例代码
2018/01/03 Python
利用python在大量数据文件下删除某一行的例子
2019/08/21 Python
TensorFlow tf.nn.conv2d实现卷积的方式
2020/01/03 Python
Python参数传递对象的引用原理解析
2020/05/22 Python
HTML5移动开发图片压缩上传功能
2016/11/09 HTML / CSS
Delphi软件工程师试题
2013/01/29 面试题
毕业生的自我评价
2013/12/30 职场文书
应聘医药销售自荐书范文
2014/02/08 职场文书
安全责任书范文
2014/03/12 职场文书
体育专业自荐书
2014/05/29 职场文书
授权委托书格式范文
2014/08/02 职场文书
党员教师群众路线个人整改措施
2014/10/28 职场文书
小学生2015教师节演讲稿
2015/03/19 职场文书
2015年班干部工作总结
2015/04/29 职场文书
2015年十月一日放假通知
2015/08/18 职场文书
四年级作文之说明文作文
2019/10/14 职场文书
vue+element ui实现锚点定位
2021/06/29 Vue.js