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__()何時會被調用也是不確定的。
類對象的特殊方法之__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__中的元素。
總結
以上是生活随笔為你收集整理的python学习高级篇(part10)--类对象的特殊方法和特殊属性的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: js之语句(表达式语句,复合语句,声明语
- 下一篇: python使用指南(part1)--去