Python的return self和return一个新的对象区别
目的:设计一个有理数相加。如3/5 + 7/15 = 80/75
return self
输入:
class Rational0:
def __init__(self, num, den=1):
self.num = num
self.den = den
def plus(self, another):
den = self.den * another.den
num = (self.num * another.den + self.den * another.num)
return self
def print(self):
print(str(self.num) + "/" + str(self.den))
输出:
>>> r1 = Rational0(3, 5)
>>> r1.print()
3/5
>>> r1
<__main__.Rational0 object at 0x000001D1D91A5F60>
>>> r2 = r1.plus(Rational0(7,15)) # 新对象r2
>>> r2
<__main__.Rational0 object at 0x000001D1D91A5F60> # 地址相同
>>> r1.plus(Rational0(7,15)).print() #或者r2.print()
3/5
>>> r2.num
3
>>> r2.den
5
从地址中可以看出Rational0(3, 5)和r1.plus(Rational0(7,15))返回的对象是同一个r1地址,原因在于return self。
return self做出修改
class Rational0:
def __init__(self, num, den=1):
self.num = num
self.den = den
def plus(self, another):
den = self.den * another.den
num = (self.num * another.den + self.den * another.num)
self.den = den
self.num = num
return self
#return Rational0(num, den)
def print(self):
print(str(self.num) + "/" + str(self.den))
r1 = Rational0(3, 5)
r2 = r1.plus(Rational0(7,15))
r2.print()
输出:
>>> r1 = Rational0(3, 5)
>>> r1.print()
3/5
>>> r1
<__main__.Rational0 object at 0x00000239CADF5E80>
>>> r2 = r1.plus(Rational0(7,15))
>>> r2.print()
80/75
>>> r2
<__main__.Rational0 object at 0x00000239CADF5E80>
>>> r2.num
80
>>> r2.den
75
分析:



return新的对象
输入:
class Rational0:
def __init__(self, num, den=1):
self.num = num
self.den = den
def plus(self, another):
den = self.den * another.den
num = (self.num * another.den + self.den * another.num)
return Rational0(num, den)
def print(self):
print(str(self.num) + "/" + str(self.den))
输出:
>>> r1 = Rational0(3, 5)
>>> r1.print()
3/5
>>> r1
<__main__.Rational0 object at 0x000001F857C35DD8>
>>> r2 = r1.plus(Rational0(7,15)) # 新对象r2
<__main__.Rational0 object at 0x000001F857C48940> #地址不同
>>>r2.print()
80/75
>>> r2.num
80
>>> r2.den
75
从地址中可以看出Rational0(3, 5)和r1.plus(Rational0(7,15))返回的对象不是同一个,原因在于return Rational0(num, den)。
Python的return self和return一个新的对象区别的更多相关文章
- Java中如何创建一个新的对象的/Creating Objects/
The Java Tutorials have been written for JDK 8. Examples and practices described in this page don't ...
- JavaScript 如何从引用类型(Array 、 Object)创建一个新的对象
数组的增删改 1.新增一项可以使用concat方法,它不会对原有数组进行改动,而是创建一个新数组 let a = [0, 1, 2] let b = a.concat([3]) console.log ...
- python基础一 ------利用生成器生成一个可迭代对象
#利用生成器生成一个可迭代对象#需求:生成可迭代对象,输出指定范围内的素数,利用生成器产生一个可迭代对象#生成器:本身是可迭代的,只是 yield 好比return返回,yield返回后函数冻结状态, ...
- python基础===用9种方式生成新的对象
class Point: def __init__(self, x, y): self.x = x self.y = y point1 = Point(1, 2) point2 = eval(&quo ...
- 从一个数组对象中取key 和value组成一个新的对象
const type = [ {key:'TimeWeiDu',value:'时间维度'}, {key:'TranType',value:'交易类型'}, {key:'OrderType',value ...
- JS——数组中push对象,覆盖问题,每次都创建一个新的对象
今天写运动框架时,发现将对象push进数组,后面的值会覆盖前面的值,最后输出的都是最后一次的值.其实这一切都是引用数据类型惹的祸. 如果你也有类似问题,可以继续看下去哦. 下面 ...
- sorted函数返回一个新的列表就安全了吗?
arr=[[1,2,3],[4,2,3],[5,2,3]] x2=sorted(arr) print 'sorted',x2 print '-'*20 for ar in arr: ar.append ...
- 用Java实现一个通用并发对象池
这篇文章里我们主要讨论下如何在Java里实现一个对象池.最近几年,Java虚拟机的性能在各方面都得到了极大的提升,因此对大多数对象而言,已经没有必要通过对象池来提高性能了.根本的原因是,创建一个新的对 ...
- WebKit JavaScript Binding添加新DOM对象的三种方式
一.基础知识 首先WebKit IDL并非完全遵循Web IDL,只是借鉴使用.WebKit官网提供了一份说明(WebKitIDL),比如Web IDL称"operation”(操作), 而 ...
随机推荐
- boot2docker里报"no space left on device" error的解决方法
docker中pull远程image时:报 no space left on device virtualbox中调大虚拟内存即可.. 之前调的硬盘大小...
- C++ 虚析构(virtual destructor)原理
注意:本文仅为个人理解,可能有误! 先看一段代码: #include <iostream> using namespace std; class CBase{ public: CBase( ...
- python在linux中输出带颜色的文字的方法
在开发项目过程中,为了方便调试代码,经常会向stdout中输出一些日志,默认的这些日志就直接显示在了终端中.而一般的应用服务器,第三方库,甚至服务器的一些通告也会在终端中显示,这样就搅乱了我们想要的信 ...
- React ES5 (createClass) 和 ES6 (class)
https://www.w3cplus.com/react/react-es5-createclass-vs-es6-classes.html http://blog.csdn.net/shaleil ...
- Java的版本历史与特性
一个比较流行的问题是,“Java下一个版本会有什么特性呢?” .这是否是个好问题却有待商榷.在下面的内容里,我总结了至今为止的Java主要发行版中各自引入的新特性,这样做的目的是为了突出各个新特性是在 ...
- iOS学习笔记(九)—— xml数据解析
在iPhone开发中,XML的解析有很多选择,iOS SDK提供了NSXMLParser和libxml2两个类库,另外还有很多第三方类库可选,例如TBXML.TouchXML.KissXML.Tiny ...
- hdu 4419 线段树 扫描线 离散化 矩形面积
//离散化 + 扫描线 + 线段树 //这个线段树跟平常不太一样的地方在于记录了区间两个信息,len[i]表示颜色为i的被覆盖的长度为len[i], num[i]表示颜色i 『完全』覆盖了该区间几层. ...
- virgo使用指南
一.说明: 一个windows虚拟桌面软件,很小,不到10K,占用内存也极小.超级方便. 二.GitHub地址: henkman/virgo: Virtual desktops for Windows ...
- influxDB概念
一.基本概念 1)database--数据库,这个同传统数据库的数据库概念. 2)measurement--数据表,在InfluxDB中,measurement即为表的作用,同传统数据库中的table ...
- mac安装yarn , MAC升级Nodejs
Npm i -g yarn 第一步,先查看本机node.js版本: `$ node -v` 第二步,清除node.js的cache: `$ sudo npm cache clean -f` 第三步,安 ...