日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python学习高级篇(part9)--对象的引用计数

發布時間:2023/12/19 python 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python学习高级篇(part9)--对象的引用计数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

學習筆記,僅供參考,有錯必糾


文章目錄

    • python 學習高級篇
      • 類對象的特殊方法之`__str__()`
      • 類對象的特殊方法之`__new__()`
      • 對象的引用計數
        • 什么是引用計數
        • 對象的引用計數加1的情形
        • 對象的引用計數減1的情形


python 學習高級篇


# 支持多行輸出 from IPython.core.interactiveshell import InteractiveShell InteractiveShell.ast_node_interactivity = 'all' #默認為'last'

類對象的特殊方法之__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__被調用" ... >>> mc = MyClass() >>> mc <__main__.MyClass object at 0x103e5c588> >>> print(mc) __str__被調用 >>> str(mc) '__str__被調用' >>> repr(mc) '<__main__.MyClass object at 0x103e5c588>' """""" >>> class MyClass(object): ... def __repr__(self): ... return "__repr__被調用" ... >>> mc = MyClass() >>> mc __repr__被調用 >>> print(mc) __repr__被調用 >>> str(mc) '__repr__被調用' >>> repr(mc) '__repr__被調用' """""" >>> class MyClass(object): ... def __str__(self): ... return "__str__被調用" ... def __repr__(self): ... return "__repr__被調用" ... >>> mc = MyClass() >>> mc __repr__被調用 >>> print(mc) __str__被調用 >>> str(mc) '__str__被調用' >>> repr(mc) '__repr__被調用' """ '\n>>> class MyClass(object):\n... def __str__(self):\n... return "__str__被調用"\n... def __repr__(self):\n... return "__repr__被調用"\n... \n>>> mc = MyClass()\n>>> mc\n__repr__被調用\n>>> print(mc)\n__str__被調用\n>>> str(mc)\n\'__str__被調用\'\n>>> repr(mc)\n\'__repr__被調用\'\n'

類對象的特殊方法之__str__()和__repr__()用于自定義并返回實例對象的字符串表示形式

  • 當在交互式命令行中直接打印一個實例對象時,如果在實例對象對應的類對象中實現了特殊方法__repr__(),會自動調用該方法;否則,會打印實例對象對應的類對象和實例對象在內存中的地址。
  • 當調用內置函數print打印一個實例對象時,如果在實例對象對應的類對象中實現了特殊方法__str__(),會自動調用該方法;否則,如果在實例對象對應的類對象中實現了特殊方法__repr__(),會自動調用該方法;否則,會打印實例對象對應的類對象和實例對象在內存中的地址。
  • 當調用內置函數str創建字符串并且實參是一個實例對象時,如果在實例對象對應的類對象中實現了特殊方法__str__(),會自動調用該方法;否則,如果在實例對象對應的類對象中實現了特殊方法__repr__(),會自動調用該方法;否則,會打印實例對象對應的類對象和實例對象在內存中的地址。
  • 當調用內置函數repr創建字符串并且實參是一個實例對象時,如果在實例對象對應的類對象中實現了特殊方法__repr__(),在內置函數repr的內部會自動調用該方法;否則,會打印實例對象對應的類對象和實例對象在內存中的地址。

通常情況下,類對象的特殊方法__str__()和__repr__()的實現代碼是一樣的,因此當實現了其中一個后,可以把其方法名賦值給另一個的方法名。

class MyClass(object):def __str__(self):return 'XXX'__repr__ = __str__

內置函數str()和repr()都返回對象的字符串表示,其區別在于:

  • str()的返回值是給用戶看的,更加用戶友好;
  • repr()的返回值是給程序開發者看的,是為調試服務的。
str('A \nB') repr('A \nB') 'A \nB'"'A \\nB'"

類對象的特殊方法之__new__()


當使用"類名([實參])"創建實例對象時,Python解釋器的主要處理過程包括兩大步:

  • 調用特殊方法__new__()創建實例對象:首先會查找該類對象是否實現了特殊方法__new__(),如果沒有實現,則去其父類中依次查找,直到類對象object;特殊方法__new__()會返回創建的實例對象.
  • 調用特殊方法__init__()對創建的實例對象進行初始化,__new__()返回的實例對象會作為實參被自動傳遞給__init__()的第一個形參self.
class Parent(object):def __new__(cls, *args, **kwargs):print("父類的__new__()被調用,其形參cls對應實參的id:%s" % id(cls))obj = super().__new__(cls) print("創建的實例對象的id:%s" % id(obj))return objclass Child(Parent):def __init__(self, name):print("子類的__init__()被調用,其形參self對應實參的id:%s" % id(self))self.name = nameprint("父類的id:%s" % id(Parent)) print("子類的id:%s" % id(Child))child = Child("Mike") print("創建的實例對象的id:%s" % id(child)) 父類的id:1968492033576 子類的id:1968492039240 父類的__new__()被調用,其形參cls對應實參的id:1968492039240 創建的實例對象的id:1968521654224 子類的__init__()被調用,其形參self對應實參的id:1968521654224 創建的實例對象的id:1968521654224


對象的引用計數


什么是引用計數


通常情況下,開發人員無需關心內存的分配和釋放。當創建一個對象時,系統會自動分配一塊內存以存儲該對象的信息。當該對象不再被使用時,系統會進行垃圾回收以自動釋放掉其占用的內存。

為了確保使用中的對象不會被銷毀,Python使用引用計數來跟蹤和計算內存中每個對象被引用的次數。當對象的引用計數為0時,它才可以被銷毀。


對象的引用計數加1的情形


  • 對象賦值給變量

  • 引用對象的變量賦值給另一個變量

  • 對象作為容器(例如:列表、元組、集合等)中的元素

  • 對象作為函數調用時的實參

  • class MyClass(object):passdef do_sth(param):pass# 引用計數加1,變為1 a = MyClass() # 引用計數加1,變為2 b = a # 引用計數加1,變為3 L = [1, 2, a] # 在函數的執行過程中,引用計數加1,變為4 do_sth(a) # 當函數執行后,對實參的引用會自動銷毀,因此,引用計數減1,變為3 import sys # 在函數的執行過程中,引用計數加1,變為4 print(sys.getrefcount(a)) # 當函數執行后,對實參的引用會自動銷毀,因此,引用計數減1,變為3 4


    對象的引用計數減1的情形


  • 對象離開它的作用域,例如:對象所在的函數執行完畢
  • 對象的引用被顯式銷毀
  • 引用對象的變量被賦予新的對象
  • 從容器中刪除對象,或對象所在的容器被銷毀
  • class MyClass(object):pass# 引用計數加1,變為1 x = MyClass() # 引用計數加1,變為2 y = x # 引用計數減1,變為1 del x # 引用計數加1,變為2 z = y # 引用計數減1,變為1 y = 18 # 引用計數加1,變為2 l = [1, 2, z] # 引用計數減1,變為1 del l # 在函數的執行過程中,引用計數加1,變為2 print(sys.getrefcount(z)) # 當函數執行后,對實參的引用會自動銷毀,因此,引用計數減1,變為1 2

    總結

    以上是生活随笔為你收集整理的python学习高级篇(part9)--对象的引用计数的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。