Python面向对象(上)
Python面向对象(上)
python是一门面向对象的编程语言。何为对象?对象是类的实例。在生活中,任何一个事物都是一个对象,如牡丹花。牡丹花的类是花类,同样属于花类的还有荷花、月季花、金银花、菊花、梅花、兰花等,它们都是花科,但是每一朵花都有不同的枝叶,不同的色彩,不同的长相。这就是花类的各个属性了,如玫瑰花是红色,菊花是黄色……除了属性,对象里还有方法,也就是花儿怎样开花,怎样长出形态等。
我们来剖析一下分数的构成,一个分数由 分子、分母构成,分子在上,分母在下。分子可以取任意整数,分母的值不能等于0。
现在我们就可以创建一个分数类:
class Fraction:
def __init__ (self, top, bottom):
self.num = top
self.den = bottom
所有的类都应该写构造方法,在python中,构造方法一般是__init__。Self是一个总是指向对象本身的特殊参数,它必须是第一个形式参数。然而,在调用方法时,从来不需要提供相应的实际参数。
在构造函数中,self.num与self.den定义了分子与分母,也就是说,调用对象时传入的初始值给其二者赋予:
Myfra = Fraction(3, 5)
#创建了一个对象Myfra,并给予初始值3和5,对应分子分母,所以为三分之五
如果我们要将此对象的值(也就是三分之五)打印出来,我们则需要定义一个show()方法:
def show(self):
print(str(self.num)+“/”+ str(self.den))
然后我们调用这个方法:
Myfra.show()
这样就可以显示出它的值了。但其实我们有更好的实现:
def __str__(self):
return str(self.num) +“/ ”+str( self.den))
因为python中有一套标准方法,我们可以重写它们,也就是重新定义他们,来使我们的程序更加简便。如此调用过程则为:
Myfra = Fraction(3, 5) print(Myfra)
我们可以根据这种方式来重新其他的标准方法,如实现分数之间的加法运算:
def __add__ (self, otherFraction):
newNum = self.num * otherFraction.den + \
self.den * otherFraction.num
newDen = self.den * otherFraction.den
return Fraction(newNum, newDen)
如果要使得两个分数相加,最简单的方法就是:

由上式可得上述程序,接着调用:
F1 = Fraction(1,4) F2 = Fraction(1,2) F3 = F1 + F2 print(F3)
上述程序虽然可以相加,但不是最简分数,我们可以运用欧几里得算法寻得最大公因数(GCD),然后将分子分母分别除以最大公因数,结果就是最简分数。
欧几里得算法中,对于整数m和n,如果m能被n整除,那么它们的最大公因数就是n。如果m不能被n整除,那么结果是n与m除以n的余数的最大公因数。
def gcd(m, n):
while m % n != 0:
oldm = m
oldn = n
m = oldn
n = oldm%oldn
return n
我们通过上述程序可以迭代出最大公因数,但是需要注意的是,此程序的分数不能为负数。
#改良版分数的加法
def __add__(self, otherFraction):
newNum = self.num * otherFraction.den + \
self.den * otherFraction.num
newDen = self.den * otherFraction.den
common = gcd(newNum, newDen)
return Fraction(newNum // common, newDen // common)
为了让两个分数进行比较,还需要怎加一个方法,我们可以通过重写内置方法__eq__来实现。
def __eq__(self, other):
firstNum = self.num * other.den
secNum = other.num * self.den
return firstNum == secNum
如果我们没有重写__eq__方法,那么默认比较的是两个对象实例,如果是指向同一个实例的对象,那么他们两个才能相等,这被称为浅相等。而我们重写后,两个对象只有值相同时,才是相等的,这被称为深相等。
所有代码如下:
class Fraction:
def __init__(self, top, botton):
self.num = top
self.den = botton def __str__(self):
return str(self.num) + "/" + str(self.den) def __add__(self, otherFraction):
newnum = self.num * otherFraction.den + self.den * otherFraction.num
newden = self.den * otherFraction.den common = gcd(newnum, newden) return Fraction(newnum // common, newden // common) def __eq__(self, otherFraction):
firstnum = self.num * otherFraction.den
secnum = self.den * otherFraction.num return firstnum == secnum def gcd(m, n):
while m % n != 0:
oldm = m
oldn = n
m = oldn
n = oldm % oldn
return n if __name__ == '__main__':
f1 = Fraction(3, 4)
f2 = Fraction(3, 4)
f3 = f1 + f2
print(f3)
print(f1 == f2) f4 = Fraction(4, 8)
f5 = Fraction(2, 4)
print(f4 == f5)
print(f4 + f5)
Python面向对象(上)的更多相关文章
- Python 面向对象(上)
一. 什么是面向对象? 1. 在了解面向对象之前,首先我们需要知道两个概念:(1)什么是函数?函数是对功能或动作的一种封装.函数的语法结构如下: def func(arg1): '''函数的内部有函数 ...
- python面向对象(上)
创建类 Python 类使用 class 关键字来创建.简单的类的声明可以是关键字后紧跟类名: class ClassName(bases): 'class documentation string' ...
- Python 面向对象(下)
本篇博客承接自Python 面向对象(上) 四. 继承,实现,依赖,关联,聚合,组合 Python面向对象--继承,实现,依赖,关联,聚合,组合 五. 特殊成员 Python面向对象--类的特殊成员 ...
- python学习笔记六 初识面向对象上(基础篇)
python面向对象 面向对象编程(Object-Oriented Programming )介绍 对于编程语言的初学者来讲,OOP不是一个很容易理解的编程方式,虽然大家都知道OOP的三大特性 ...
- Python开发【第七篇】:面向对象 和 python面向对象(初级篇)(上)
Python 面向对象(初级篇) 51CTO同步发布地址:http://3060674.blog.51cto.com/3050674/1689163 概述 面向过程:根据业务逻辑从上到下写垒代码 ...
- Python面向对象编程(上)
Python不仅支持面向过程编程,同时也支持面向对象编程.面向工程就是分析解决问题所需的步骤,然后用函数把这些步骤逐一实现,使用的时候再一个个调用函数就可以.面向对象则是把解决的问题按照一定规则划分为 ...
- python 面向对象初级篇
Python 面向对象(初级篇) 概述 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发" ...
- Python 面向对象 基础
编程范式概述:面向过程 和 面向对象 以及函数式编程 面向过程:(Procedure Oriented)是一种以事件为中心的编程思想. 就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现 ...
- python面向对象进阶(八)
上一篇<Python 面向对象初级(七)>文章介绍了面向对象基本知识: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使 ...
- python 面向对象(进阶篇)
上一篇<Python 面向对象(初级篇)>文章介绍了面向对象基本知识: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使 ...
随机推荐
- 微粒群算法PSO 01背包问题 python
import random import math import matplotlib.pyplot as plt import numpy as np import time def init(b_ ...
- 9.异步redis
在使用Python代码操作redis时候,连接.操作.断开都是网络IO #安装支持异步redis的模块 pip3 install aioredis async def execute(address, ...
- 使用dotnet-monitor sidecar模式 dump docker运行的dotnet程序.
前情概要 随着容器和云技术的发展, 大量的应用运行在云上的容器中, 它们的好处是毋庸置疑的, 例如极大的提高了我们的研发部署速度, 快速的扩缩容等等, 但是也存在一些小小的问题, 例如难以调试. 基于 ...
- Arctic 基于 Hive 的流批一体实践
背景 随着大数据业务的发展,基于 Hive 的数仓体系逐渐难以满足日益增长的业务需求,一方面已有很大体量的用户,但是在实时性,功能性上严重缺失:另一方面 Hudi,Iceberg 这类系统在事务性,快 ...
- 1分钟完成在线测试部署便捷收集班级同学文件的web管理系统
最近CSDN推出了一个新功能[云IDE],个人对这个新功能(比赛奖金 )挺感兴趣的,于是瞬速地拿之前自己搞的一个便捷收集班级同学文件的web管理系统(下面简称该项目为cfile)体验了一下,发现功能还 ...
- onps栈移植说明(3)——添加网卡
4. 添加网卡 移植的最后一步就是编写网卡驱动然后将网卡添加到协议栈.网卡驱动其本质上完成的是数据链路层的工作,在整个通讯链路上处于通讯枢纽位置,通讯报文的发送和接收均由其实际完成.针对网卡部分的移植 ...
- RK3568开发笔记(五):在虚拟机上使用SDK编译制作uboot、kernel和ubuntu镜像
前言 buildroot虽然灵活,但是基于实际情况,本身是侧重驱动和应用定制开发的只定制一次文件系统投入有点多,还不如直接ubunt自己交叉编译依赖库,做一些库的移植裁剪. 于是本篇就使用ubu ...
- perl中ENV的使用
在打印环境变量的时候可以用到.实际上是%ENV,perl中的哈希变量,里面保存的是环境变量.键是环境变量名,值是环境变量值.例如,有一个环境变量是PATH,其值为C:\windows,那么,打印这个环 ...
- 第2-3-4章 上传附件的接口开发-文件存储服务系统-nginx/fastDFS/minio/阿里云oss/七牛云oss
目录 5.3 接口开发-上传附件 5.3.1 接口文档 5.3.2 代码实现 5.3.3 接口测试 5.3 接口开发-上传附件 第2-1-2章 传统方式安装FastDFS-附FastDFS常用命令 第 ...
- Dubbo-聊聊Dubbo协议
前言 Dubbo源码阅读分享系列文章,欢迎大家关注点赞 SPI实现部分 Dubbo-SPI机制 Dubbo-Adaptive实现原理 Dubbo-Activate实现原理 Dubbo SPI-Wrap ...