以下代码是在学习老师的代码后自己尝试敲出来的,半背半理解的状态下写出来的,编程过程也遇到一些问题,最后还是解决了。

 

from math import gcd

class Faction(object):#定义一个分数类

def __init__(self, num, den):#属性的初始化

if den ==0:

raise ValueError('分母不能为0') #分母不能为0,否则报错

self._num= num

self._den= den

self.simplify() #调用simplify函数

self.normalize()#调用normalize函数

#初始化中分母加了下划线,表示一种特殊隐喻,为分母添加一个访问器,以便可以访问

@property

def num(self):

return self._num

@property

def den(self):

return self._den

def add(self, other):#定义加法函数

return Faction(self._num * other.den + self._den* other.num,\

self._den* other.den)

def sub(self, other):

return Faction(self._num * other.den - self._den* other.num,\

self._den* other.den)

def mul(self, other):

return Faction(self._num * other.num, self._den* other.den)

def div(self, other):

return Faction(self._num * other.den, self._den* other.num)

#方法重载,如果不加重载,在main函数中需要调用add函数才能进行加法运算。

#方法重载后就可以不用调用函数进行加法运算

#注意加法运算是self和other进行加法运算而不是自己和自己。自己编写代码过程中出现了此问题导致运行结果一直不对

def __add__(self, other):

        return self.add(other)

def __sub__(self, other):

return self.sub(other)

def __mul__(self, other):

return self.mul(other)

def __truediv__(self, other):

return self.div(other)

#进行分子分母化简

#通过调用内置函数gcd直接求分子和分母的最大公约数

#求出最大公约数后,进行整出求出化简后的分子和分母

def simplify(self):

#分子和分母化简需要分子不为0并且分母不为1的情况下进行

if self._num != 0 and self._den != 1:

factor = gcd(abs(self._num), abs(self._den))

#当最大公约数大于1时,和最大公约数进行整除求出化简后的分子和分母

#当最大公约数为1时,就不需要化简,直接返回自身数值

if factor> 1:

self._num//= factor

self._den//= factor

return self

def normalize(self):

if self._den < 0:

#分母为负数时,将负号放置在分子处,分母变整数

self._num= -self._num

self._den= -self._den

return self

#执行print会打印str函数下所有的东西

def __str__(self):

if self._num == 0:

return '0'

        elif self._den == 1:

return str(self._num)

else:

return '%d/%d'% (self._num,self._den)

def main():

f1 = Faction(3, -6)

f2 = Faction(3, 4)

print(f1)

print(f2)

#由于以上使用了方法的重载,所以可以直接写f1+f2,否在需要写成print(f1.add(f2))

print(f1 + f2)

print(f1 - f2)

print(f1 * f2)

print(f1 / f2)

if __name__ == '__main__':

main()

定义一个类描述分数,并提供加减乘除运算 以及分数化简相关推荐

  1. python定义一个类描述数字时钟_定义一个时间类Time,能提供和设置由时、分、秒组成的时间,编写出应用程序,定义时间对象t...

    展开全部 [基本题]定义一个时间类,提供设定时间.显示时间和秒数增加e68a8432313133353236313431303231363533313334336361371的功能,其中设定时间的方法 ...

  2. python定义一个类描述数字时钟_python自定义时钟类、定时任务类

    这是我使用python写的第一个类(也算是学习面向对象语言以来正式写的第一个解耦的类),记录下改进的过程. 分析需求 最初,因为使用time模块显示日期时,每次都要设置时间字符串的格式,挺麻烦,但还是 ...

  3. 按要求编写一个Java应用程序:(1)定义一个类,描述一个矩形,包含有长、宽两种属性,和计算面积方法。(2)编写一个类,继承自矩形类,同时该类描述长方体,具有长、宽、高属性

    (1)定义一个类,描述一个矩形,包含有长.宽两种属性,和计算面积方法. public class Jvcs {private int Long; //长private int wide; //宽pub ...

  4. python数字计时器类# 定义⼀个类描述平⾯上的点并提供移动点和计算到另⼀个点距离的⽅法

    #数字计时器类 from time import sleep#从time模块中引入sleep函数,使用sleep函数可以让程序休眠(推迟调用线程的运行). class Jishi(object):'' ...

  5. 定义一个类,描述一个矩形,包含有长、宽两种属性,和计算面积方法。

    题目: 按要求编写一个Java应用程序: (1)定义一个类,描述一个矩形,包含有长.宽两种属性,和计算面积方法. (2)编写一个类,继承自矩形类,同时该类描述长方体,具有长.宽.高属性, 和计算体积的 ...

  6. java设计一个bank类实现银行_java定义一个类实现银行账户的概念。

    2016-11-17 13:40黄瞩信 客户经理 比如,只定义了一个抽象方法run(),而要通过系统用极短的时间.这5s内,此后这个线程就不能进入其它状态,进入消亡状态;+i++). 2,另一方面;, ...

  7. Java创建一个文件变量_java如何定义一个类,创建它的成员变量和方法?

    展开全部 类即对象的思想,一个对象包含e68a843231313335323631343130323136353331333337623439了属于自己的成员变量和操作方法. 如何定义一个类,得看你对 ...

  8. java定义一个类_java如何定义一个类,创建它的成员变量和方法?

    展开全部 类即对象的思想,一个对象包含e69da5e887aa3231313335323631343130323136353331333337623439了属于自己的成员变量和操作方法. 如何定义一个 ...

  9. python中定义类的关键字_在Python中,定义一个类使用什么关键字?

    [多选题]技术应用的限制包括 [多选题]关于类和对象,下面说法正确的有? [判断题]温度越高,料液的粘度越小,扩散系数越大,可提高膜通量. [单选题]某企业有10台运货车,已知每台车每运行100小时平 ...

  10. Python什么是闭包、闭包特征、定义闭包传入一个数求和并输出,定义一个装饰器:打印函数运行花费的时间,定义一个类:要求:包含一个对象属性,且用_(单下划线)命名的定义一个类方法(装饰器)

    1. 闭包.闭包特征及应用 1.1 什么是闭包? 闭包就是外部函数中定义一个内部函数,内部函数引用外部函数中的变量,外部函数的返回值是内部函数; 闭包是由函数及其相关的引用环境组合而成的实体(即:闭包 ...

最新文章

  1. Azure系列2.1.15 —— SharedAccessBlobPolicy
  2. 【全栈React】第6天: 状态
  3. Linux下的DNS服务器搭建
  4. 102. Leetcode 198. 打家劫舍 (动态规划-打家劫舍)
  5. web后端学习过程中技巧总结(持续更新。。。)
  6. biginteger 原理_Java Bigdecimal使用原理详解
  7. 从一个数组中找出最接近目标_LeetCode每日一题 | 转变数组后最接近目标值的数组和...
  8. LeetCode:225. 用队列实现栈
  9. 与 Brian Kernighan 一起回忆 Unix 的诞生!
  10. IntelliJ IDEA打开错误 _CGContextSetAllowsAcceleration
  11. APP完整的启动流程
  12. Transformer预训练模型已经变革NLP领域,一文概览当前现状
  13. (转)WinForm中的各种表格控件
  14. KVM通过qemu实现USB重定向
  15. Office 365系列(1)------Office 365邮箱申请及初步配置说明
  16. jQuery选择器(二)(基本过滤器,内容过滤器,可见过滤器)
  17. Ubuntu16.04使用语义分割标注工具Semantic-Segmentation-Editor
  18. 在ubuntu上搭建IC数模混合环境
  19. c4d里.gil和.gi2是什么文件?怎么打开
  20. 基于arduino的5路循迹小车(1)

热门文章

  1. 进程ld-linux-x86-64是什么,解决挖矿病毒占用cpu以及误删 ld-linux-x86-64.so.2 文件的问题...
  2. 对Ajax回调函数中返回错误信息的处理及常见情况整理
  3. 不一样的90后创业者:创业是另一种生活方式
  4. 1273-宣传墙(第九届河南省ICPC省赛 --状压DP)
  5. 东西向流量/南北向流量
  6. python滑稽脸程序
  7. 10个您不想错过的最佳网页设计软件
  8. 【无人机】【2017.10】无人机(UAV)在地学野外工作中建立增强型虚拟野外指南(EVFG)的作用研究
  9. 超详细!联想小新700黑苹果双系统完整教程(1)
  10. 巧用 Cowrie 部署 SSH 蜜罐,让黑客攻击无处遁形!