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脚本生成Android SALT扰码的方法
Sep 18 Python
基于Python数据可视化利器Matplotlib,绘图入门篇,Pyplot详解
Oct 13 Python
从0开始的Python学习014面向对象编程(推荐)
Apr 02 Python
django框架防止XSS注入的方法分析
Jun 21 Python
python读取大文件越来越慢的原因与解决
Aug 08 Python
VSCode基础使用与VSCode调试python程序入门的图文教程
Mar 30 Python
Python sorted排序方法如何实现
Mar 31 Python
python 引用传递和值传递详解(实参,形参)
Jun 05 Python
Scrapy模拟登录赶集网的实现代码
Jul 07 Python
python录音并调用百度语音识别接口的示例
Dec 01 Python
python将YUV420P文件转PNG图片格式的两种方法
Jan 22 Python
python unittest单元测试的步骤分析
Aug 02 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
如何限制访问者的ip(PHPBB的代码)
2006/10/09 PHP
php 判断数组是几维数组
2013/03/20 PHP
PHP Global定义全局变量使用说明
2013/08/15 PHP
php pthreads多线程的安装与使用
2016/01/19 PHP
FleaPHP框架数据库查询条件($conditions)写法总结
2016/03/19 PHP
基于jquery的tab切换 js原理
2010/04/01 Javascript
XMLHTTPRequest的属性和方法简介
2010/11/23 Javascript
基于jquery的时间段实现代码
2012/08/02 Javascript
js获取客户端网卡的IP地址、MAC地址
2014/03/26 Javascript
利用React-router+Webpack快速构建react程序
2016/10/27 Javascript
如何在 Vue.js 中使用第三方js库
2017/04/25 Javascript
利用js canvas实现五子棋游戏
2020/10/11 Javascript
[01:18]DOTA2超级联赛专访hanci ForLove淘汰感言曝光
2013/06/04 DOTA
[04:21]狐狸妈带你到现场 DOTA2 TI中国区预选赛线下赛路线指引
2014/05/22 DOTA
Python Sql数据库增删改查操作简单封装
2016/04/18 Python
Python将一个Excel拆分为多个Excel
2018/11/07 Python
pyqt5实现按钮添加背景图片以及背景图片的切换方法
2019/06/13 Python
Python 分享10个PyCharm技巧
2019/07/13 Python
python使用正则表达式(Regular Expression)方法超详细
2019/12/30 Python
从多个tfrecord文件中无限读取文件的例子
2020/02/17 Python
解决pyqt5异常退出无提示信息的问题
2020/04/08 Python
基于PyQT实现区分左键双击和单击
2020/05/19 Python
使用css3实现超炫的loading加载动画效果
2014/05/07 HTML / CSS
CSS3 画基本图形,圆形、椭圆形、三角形等
2016/09/20 HTML / CSS
瑞典时尚耳机品牌:Urbanears
2017/07/26 全球购物
Skyscanner阿联酋:全球领先的旅游搜索平台
2017/11/25 全球购物
Capitol Lighting的1800lighting.com:住宅和商业照明
2019/04/10 全球购物
英国卫浴商店:Ergonomic Design
2019/09/22 全球购物
团员的自我评价
2013/12/01 职场文书
2013年研究生毕业感言
2014/02/06 职场文书
代理协议书
2014/04/22 职场文书
资助贫困学生倡议书
2014/05/16 职场文书
大学生推广普通话演讲稿
2014/09/21 职场文书
列车乘务员工作不细心检讨书
2014/10/07 职场文书
什么是执行力?9个故事告诉您:成功绝非偶然!
2019/07/05 职场文书
国庆节到了,利用JS实现一个生成国庆风头像的小工具 详解实现过程
2021/10/05 Javascript