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

歡迎訪問 生活随笔!

生活随笔

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

python

python学习高级篇(part7)--特殊属性和特殊方法

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

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


文章目錄

    • python 學習高級篇
      • 特殊屬性和特殊方法
      • 獲取對象的信息之特殊屬性`__dict__`
      • 獲取對象的信息之反射
      • 類對象的特殊方法`__len__()`


python 學習高級篇


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

特殊屬性和特殊方法


調(diào)用內(nèi)置函數(shù)dir()后的返回值中,很多屬性和方法都是以雙下劃線__開頭和結尾的,這些屬性和方法中的絕大多數(shù)都繼承自類object.


以雙下劃線__開頭和結尾的屬性被稱為特殊屬性,以雙下劃線__開頭和結尾的方法被稱為特殊方法。特殊屬性和特殊方法都是系統(tǒng)預定義的,我們自定義的屬性名和方法名不要以雙下劃線__開頭和結尾。在我們自定義類對象時,經(jīng)常會重寫一個或多個特殊方法,例如__init__。特殊方法會在特定的情形下被自動調(diào)用,很少需要手動調(diào)用特殊方法。

print(dir(object)) ['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']

獲取對象的信息之特殊屬性__dict__


對于指定的類對象或實例對象,可以訪問特殊屬性__dict__獲得該類對象或實例對象所綁定的所有屬性和方法的字典。

其中,字典中的鍵為屬性名或方法名。

class MyClass(object):ca = 'ca'def __init__(self):self.ia = 'ia'def im(self):pass@classmethoddef cm(cls):pass@staticmethoddef sm():passMyClass.ca2 = 'ca2' print(MyClass.__dict__) {'__module__': '__main__', 'ca': 'ca', '__init__': <function MyClass.__init__ at 0x0000019632EE58C8>, 'im': <function MyClass.im at 0x0000019632EE5950>, 'cm': <classmethod object at 0x0000019632EEE3C8>, 'sm': <staticmethod object at 0x0000019632EEE438>, '__dict__': <attribute '__dict__' of 'MyClass' objects>, '__weakref__': <attribute '__weakref__' of 'MyClass' objects>, '__doc__': None, 'ca2': 'ca2'} mc = MyClass() mc.ia2 = 'ia2' print(mc.__dict__) {'ia': 'ia', 'ia2': 'ia2'}

獲取對象的信息之反射


所謂’反射’,指的是以字符串的形式來操作(包括:增刪改查)對象的屬性和方法。



class MyClass(object):def __init__(self):self.x = 1def do_sth(self):print("do_sth被調(diào)用")mc = MyClass()print(hasattr(mc, 'x')) print(hasattr(mc, 'do_sth')) print(hasattr(mc, 'y')) print(getattr(mc, 'x')) f = getattr(mc, 'do_sth') f() # print(getattr(mc, 'y')) print(getattr(mc, 'y', 2)) setattr(mc, 'z', 3) print(getattr(mc, 'z'))setattr(mc, 'z', 4) print(getattr(mc, 'z')) delattr(mc, 'z') print(hasattr(mc, 'z')) True True False 1 do_sth被調(diào)用 2 3 4 False

類對象的特殊方法__len__()


# 內(nèi)置函數(shù)len()用于返回對象的長度 print(len([1, 2, 3, 4, 5])) print(len('abcde')) print(len({'a': 1, 'b': 2, 'c': 3})) 5 5 3

在上面的例子中,內(nèi)置函數(shù)len()的實參都是內(nèi)置類對象的實例對象,例如:

[1, 2, 3, 4, 5] 是內(nèi)置類對象list的一個實例對象;

{‘a(chǎn)’: 1, ‘b’: 2, ‘c’: 3} 是內(nèi)置類對象dict的一個實例對象。

# 內(nèi)置函數(shù)len()的實參在默認情況下不能是自定義類對象的實例對象。 class MyClass(object):passprint(len(MyClass())) # object of type 'MyClass' has no len() ---------------------------------------------------------------------------TypeError Traceback (most recent call last)<ipython-input-14-ecf26a5a6c12> in <module>()3 pass4 ----> 5 print(len(MyClass()))TypeError: object of type 'MyClass' has no len()

如果想讓內(nèi)置函數(shù)len()的實參可以是自定義類對象的實例對象,必須在自定義類對象中實現(xiàn)特殊方法__len__()。這樣,調(diào)用內(nèi)置函數(shù)len()時,在其內(nèi)部會自動調(diào)用實參所對應類對象的特殊方法__len__()。之所以內(nèi)置函數(shù)len()的實參可以是上述內(nèi)置類對象的實例對象,是因為上述的內(nèi)置類對象中都實現(xiàn)了特殊方法__len__().

class MyClass(object):def __len__(self):return 18print(len(MyClass())) 18

總結

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

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。