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

歡迎訪問 生活随笔!

生活随笔

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

python

python学习高级篇(part10)--类对象的特殊方法和特殊属性

發布時間:2023/12/19 python 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python学习高级篇(part10)--类对象的特殊方法和特殊属性 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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


文章目錄

    • python 學習高級篇
      • 類對象的特殊方法之`__del__()`
      • 類對象的特殊方法之`__getattr__()`
      • 類對象的特殊方法之`__getitem__()`
      • 類對象的特殊方法之`__call__()`
      • 類對象的特殊屬性之`__doc__`
        • 什么是類對象的文檔字符串(docstring)
        • 訪問類對象的文檔字符串
      • 類對象的特殊屬性之`__slots__`


python 學習高級篇

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

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


系統會自動銷毀不再需要的對象以釋放內存。因此,當對象被銷毀時通常不需要手動地執行清理工作。但是,當使用我們自己創建的資源時,可能需要執行一些額外的清理工作,例如,如果創建了一個自定義的類對象來打開一個文件并寫入一些數據,可能需要在實例對象被銷毀之前關閉該文件。為了執行這些額外的清理工作,可以在自定義的類對象中實現特殊方法__del__()
當內存中的對象被銷毀(垃圾回收)之前,會自動調用其對應的特殊方法__del__(),當對象的引用計數為0時,對象并不會立刻被銷毀(垃圾回收),何時進行垃圾回收是不確定的。因此特殊方法__del__()何時會被調用也是不確定的。

class MyClass(object):def __del__(self):print("特殊方法__del__被調用")mc = MyClass() del mc 特殊方法__del__被調用

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


當訪問實例對象的屬性或方法時,如果指定的屬性或方法不存在,就會拋出AttributeError

class MyClass(object):passmc = MyClass()# print(mc.data) # mc.do_sth() class SomeClass(object):def __getattr__(self, name):if name == "data":return 18elif name == "do_sth":return printraise AttributeError("'SomeClass' object has no attribute '%s'" % name)sc = SomeClass() print(sc.data) sc.do_sth(1, 2, 3) print(sc.score) 18 1 2 3---------------------------------------------------------------------------AttributeError Traceback (most recent call last)<ipython-input-2-8800c5726d47> in <module>()19 print(sc.data)20 sc.do_sth(1, 2, 3) ---> 21 print(sc.score)<ipython-input-2-8800c5726d47> in __getattr__(self, name)14 elif name == "do_sth":15 return print ---> 16 raise AttributeError("'SomeClass' object has no attribute '%s'" % name)17 18 sc = SomeClass()AttributeError: 'SomeClass' object has no attribute 'score'

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


對于自定義類對象的實例對象,在默認情況下,是不能像列表和字典那樣使用中括號語法來操作數據的.

# 報錯示例 class MyClass(object):passmc = MyClass() print(mc[3]) ---------------------------------------------------------------------------TypeError Traceback (most recent call last)<ipython-input-3-408294622327> in <module>()4 5 mc = MyClass() ----> 6 print(mc[3])TypeError: 'MyClass' object does not support indexing

class MyDict(object):def __init__(self):self.data = {}def __getitem__(self, key):return self.data[key]def __setitem__(self, key, value):self.data[key] = valuedef __delitem__(self, key):del self.data[key]md = MyDict()md["one"] = 18 md["two"] = 32 print(md.data) print(md["two"]) del md["two"] print(md.data) {'one': 18, 'two': 32} 32 {'one': 18}

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


如果在類對象中實現了特殊方法__call__(),那么就可以像調用函數一樣直接調用這個類對象的實例對象,從而會自動調用特殊方法__call__()

class MyClass(object):def __call__(self, *args, **kwargs):print(args, kwargs)mc = MyClass() mc() mc(1, 2, x = 3, y = 4) () {} (1, 2) {'x': 3, 'y': 4}

內置函數callable用于判斷指定對象是否是可調用的。

除了函數對象是可調用的之外,對于實現了特殊方法__call__()的類對象,其實例對象也是可調用的.

print(callable(print)) def do_sth():passprint(callable(do_sth)) print(callable(MyClass())) True True True

類對象的特殊屬性之__doc__


調用內置函數dir得到的類對象的所有屬性中,有一個特殊屬性叫__doc__,用于表示類對象的文檔字符串。


什么是類對象的文檔字符串(docstring)


與函數的文檔字符串類似,位于類對象的第一行的字符串被稱為類對象的文檔字符串,通常用三個引號表示。

類對象的文檔字符串是對類對象的功能的簡要描述。

在PyCharm,類對象的文檔字符串用灰色顯示。

之所以稱為”文檔”字符串,是因為可以使用工具根據文檔字符串自動地生成文檔。

應該養成編寫文檔字符串的習慣,以提高程序的可讀性。

class MyClass(object):"""這是類對象的文檔字符串"""passprint(list.__doc__) print(MyClass.__doc__) list() -> new empty list list(iterable) -> new list initialized from iterable's items 這是類對象的文檔字符串

訪問類對象的文檔字符串


通過類對象的特殊屬性__doc__可以訪問類對象的文檔字符串。

調用內置函數help()得到的幫助信息中會包含類對象的文檔字符串。

print(help(MyClass)) Help on class MyClass in module __main__:class MyClass(builtins.object)| 這是類對象的文檔字符串| | Data descriptors defined here:| | __dict__| dictionary for instance variables (if defined)| | __weakref__| list of weak references to the object (if defined)None

類對象的特殊屬性之__slots__


Python是動態語言,所以,在創建對象之后,可以對其動態地綁定屬性和方法。如果想要對實例對象動態綁定的屬性和方法的名稱進行限制,可以在其對應的類對象中
定義特殊屬性__slots__,并給__slots__賦值一個所有元素都為字符串的列表或元組,這樣,對實例對象動態綁定的屬性和方法的名稱就只能來自于__slots__中的元素。

class MyClass(object):__slots__ = ("attr1", "do_sth1")mc = MyClass()mc.attr1 = 18 print(mc.attr1) mc.attr2 = 56 18---------------------------------------------------------------------------AttributeError Traceback (most recent call last)<ipython-input-16-00d2b782091c> in <module>()6 mc.attr1 = 187 print(mc.attr1) ----> 8 mc.attr2 = 56AttributeError: 'MyClass' object has no attribute 'attr2' def do_sth1(self):print("do_sth1被調用了")from types import MethodType mc.do_sth1 = MethodType(do_sth1, mc) mc.do_sth1()def do_sth2(self):print("do_sth2被調用了")mc.do_sth2 = MethodType(do_sth2, mc) do_sth1被調用了---------------------------------------------------------------------------AttributeError Traceback (most recent call last)<ipython-input-17-1f6069f24f7c> in <module>()9 print("do_sth2被調用了")10 ---> 11 mc.do_sth2 = MethodType(do_sth2, mc)AttributeError: 'MyClass' object has no attribute 'do_sth2'

print(MyClass().__dict__) ---------------------------------------------------------------------------AttributeError Traceback (most recent call last)<ipython-input-18-28c05d22bcd8> in <module>() ----> 1 print(MyClass().__dict__)AttributeError: 'MyClass' object has no attribute '__dict__'

class MyChildClass1(MyClass):passmcc1 = MyChildClass1()mcc1.attr3 = 56 print(mcc1.attr3)class MyChildClass2(MyClass):__slots__ = ("attr2", "do_sth2")mcc2 = MyChildClass2()mcc2.attr1 = 18 mcc2.attr2 = 18 mcc2.do_sth1 = 18 mcc2.do_sth2 = 18 mcc2.attr3 = 18 56---------------------------------------------------------------------------AttributeError Traceback (most recent call last)<ipython-input-20-b395fc2cfc5f> in <module>()16 mcc2.do_sth1 = 1817 mcc2.do_sth2 = 18 ---> 18 mcc2.attr3 = 18AttributeError: 'MyChildClass2' object has no attribute 'attr3'

總結

以上是生活随笔為你收集整理的python学习高级篇(part10)--类对象的特殊方法和特殊属性的全部內容,希望文章能夠幫你解決所遇到的問題。

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