python学习高级篇(part9)--对象的引用计数
學(xué)習(xí)筆記,僅供參考,有錯(cuò)必糾
文章目錄
- python 學(xué)習(xí)高級(jí)篇
- 類(lèi)對(duì)象的特殊方法之`__str__()`
- 類(lèi)對(duì)象的特殊方法之`__new__()`
- 對(duì)象的引用計(jì)數(shù)
- 什么是引用計(jì)數(shù)
- 對(duì)象的引用計(jì)數(shù)加1的情形
- 對(duì)象的引用計(jì)數(shù)減1的情形
python 學(xué)習(xí)高級(jí)篇
# 支持多行輸出 from IPython.core.interactiveshell import InteractiveShell InteractiveShell.ast_node_interactivity = 'all' #默認(rèn)為'last'
類(lèi)對(duì)象的特殊方法之__str__()
在python的交互式界面中,我們敲入如下代碼
""" >>> class MyClass(object): ... pass ... >>> mc = MyClass() >>> mc <__main__.MyClass object at 0x103f41550> >>> print(mc) <__main__.MyClass object at 0x103f41550> >>> str(mc) '<__main__.MyClass object at 0x103f41550>' >>> repr(mc) '<__main__.MyClass object at 0x103f41550>' """""" >>> class MyClass(object): ... def __str__(self): ... return "__str__被調(diào)用" ... >>> mc = MyClass() >>> mc <__main__.MyClass object at 0x103e5c588> >>> print(mc) __str__被調(diào)用 >>> str(mc) '__str__被調(diào)用' >>> repr(mc) '<__main__.MyClass object at 0x103e5c588>' """""" >>> class MyClass(object): ... def __repr__(self): ... return "__repr__被調(diào)用" ... >>> mc = MyClass() >>> mc __repr__被調(diào)用 >>> print(mc) __repr__被調(diào)用 >>> str(mc) '__repr__被調(diào)用' >>> repr(mc) '__repr__被調(diào)用' """""" >>> class MyClass(object): ... def __str__(self): ... return "__str__被調(diào)用" ... def __repr__(self): ... return "__repr__被調(diào)用" ... >>> mc = MyClass() >>> mc __repr__被調(diào)用 >>> print(mc) __str__被調(diào)用 >>> str(mc) '__str__被調(diào)用' >>> repr(mc) '__repr__被調(diào)用' """ '\n>>> class MyClass(object):\n... def __str__(self):\n... return "__str__被調(diào)用"\n... def __repr__(self):\n... return "__repr__被調(diào)用"\n... \n>>> mc = MyClass()\n>>> mc\n__repr__被調(diào)用\n>>> print(mc)\n__str__被調(diào)用\n>>> str(mc)\n\'__str__被調(diào)用\'\n>>> repr(mc)\n\'__repr__被調(diào)用\'\n'類(lèi)對(duì)象的特殊方法之__str__()和__repr__()用于自定義并返回實(shí)例對(duì)象的字符串表示形式
- 當(dāng)在交互式命令行中直接打印一個(gè)實(shí)例對(duì)象時(shí),如果在實(shí)例對(duì)象對(duì)應(yīng)的類(lèi)對(duì)象中實(shí)現(xiàn)了特殊方法__repr__(),會(huì)自動(dòng)調(diào)用該方法;否則,會(huì)打印實(shí)例對(duì)象對(duì)應(yīng)的類(lèi)對(duì)象和實(shí)例對(duì)象在內(nèi)存中的地址。
- 當(dāng)調(diào)用內(nèi)置函數(shù)print打印一個(gè)實(shí)例對(duì)象時(shí),如果在實(shí)例對(duì)象對(duì)應(yīng)的類(lèi)對(duì)象中實(shí)現(xiàn)了特殊方法__str__(),會(huì)自動(dòng)調(diào)用該方法;否則,如果在實(shí)例對(duì)象對(duì)應(yīng)的類(lèi)對(duì)象中實(shí)現(xiàn)了特殊方法__repr__(),會(huì)自動(dòng)調(diào)用該方法;否則,會(huì)打印實(shí)例對(duì)象對(duì)應(yīng)的類(lèi)對(duì)象和實(shí)例對(duì)象在內(nèi)存中的地址。
- 當(dāng)調(diào)用內(nèi)置函數(shù)str創(chuàng)建字符串并且實(shí)參是一個(gè)實(shí)例對(duì)象時(shí),如果在實(shí)例對(duì)象對(duì)應(yīng)的類(lèi)對(duì)象中實(shí)現(xiàn)了特殊方法__str__(),會(huì)自動(dòng)調(diào)用該方法;否則,如果在實(shí)例對(duì)象對(duì)應(yīng)的類(lèi)對(duì)象中實(shí)現(xiàn)了特殊方法__repr__(),會(huì)自動(dòng)調(diào)用該方法;否則,會(huì)打印實(shí)例對(duì)象對(duì)應(yīng)的類(lèi)對(duì)象和實(shí)例對(duì)象在內(nèi)存中的地址。
- 當(dāng)調(diào)用內(nèi)置函數(shù)repr創(chuàng)建字符串并且實(shí)參是一個(gè)實(shí)例對(duì)象時(shí),如果在實(shí)例對(duì)象對(duì)應(yīng)的類(lèi)對(duì)象中實(shí)現(xiàn)了特殊方法__repr__(),在內(nèi)置函數(shù)repr的內(nèi)部會(huì)自動(dòng)調(diào)用該方法;否則,會(huì)打印實(shí)例對(duì)象對(duì)應(yīng)的類(lèi)對(duì)象和實(shí)例對(duì)象在內(nèi)存中的地址。
通常情況下,類(lèi)對(duì)象的特殊方法__str__()和__repr__()的實(shí)現(xiàn)代碼是一樣的,因此當(dāng)實(shí)現(xiàn)了其中一個(gè)后,可以把其方法名賦值給另一個(gè)的方法名。
class MyClass(object):def __str__(self):return 'XXX'__repr__ = __str__內(nèi)置函數(shù)str()和repr()都返回對(duì)象的字符串表示,其區(qū)別在于:
- str()的返回值是給用戶看的,更加用戶友好;
- repr()的返回值是給程序開(kāi)發(fā)者看的,是為調(diào)試服務(wù)的。
類(lèi)對(duì)象的特殊方法之__new__()
當(dāng)使用"類(lèi)名([實(shí)參])"創(chuàng)建實(shí)例對(duì)象時(shí),Python解釋器的主要處理過(guò)程包括兩大步:
- 調(diào)用特殊方法__new__()創(chuàng)建實(shí)例對(duì)象:首先會(huì)查找該類(lèi)對(duì)象是否實(shí)現(xiàn)了特殊方法__new__(),如果沒(méi)有實(shí)現(xiàn),則去其父類(lèi)中依次查找,直到類(lèi)對(duì)象object;特殊方法__new__()會(huì)返回創(chuàng)建的實(shí)例對(duì)象.
- 調(diào)用特殊方法__init__()對(duì)創(chuàng)建的實(shí)例對(duì)象進(jìn)行初始化,__new__()返回的實(shí)例對(duì)象會(huì)作為實(shí)參被自動(dòng)傳遞給__init__()的第一個(gè)形參self.
對(duì)象的引用計(jì)數(shù)
什么是引用計(jì)數(shù)
通常情況下,開(kāi)發(fā)人員無(wú)需關(guān)心內(nèi)存的分配和釋放。當(dāng)創(chuàng)建一個(gè)對(duì)象時(shí),系統(tǒng)會(huì)自動(dòng)分配一塊內(nèi)存以存儲(chǔ)該對(duì)象的信息。當(dāng)該對(duì)象不再被使用時(shí),系統(tǒng)會(huì)進(jìn)行垃圾回收以自動(dòng)釋放掉其占用的內(nèi)存。
為了確保使用中的對(duì)象不會(huì)被銷(xiāo)毀,Python使用引用計(jì)數(shù)來(lái)跟蹤和計(jì)算內(nèi)存中每個(gè)對(duì)象被引用的次數(shù)。當(dāng)對(duì)象的引用計(jì)數(shù)為0時(shí),它才可以被銷(xiāo)毀。
對(duì)象的引用計(jì)數(shù)加1的情形
對(duì)象賦值給變量
引用對(duì)象的變量賦值給另一個(gè)變量
對(duì)象作為容器(例如:列表、元組、集合等)中的元素
對(duì)象作為函數(shù)調(diào)用時(shí)的實(shí)參
對(duì)象的引用計(jì)數(shù)減1的情形
總結(jié)
以上是生活随笔為你收集整理的python学习高级篇(part9)--对象的引用计数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 济南房贷利率
- 下一篇: python学习高级篇(part10)-