<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在python中,以單下劃線開頭的(_a)的代表不能直接存取的類屬性,需通過類提供的介面進行存取,不能用“from xxx import *”而匯入,“單下劃線” 開始的成員變數叫做保護變數,意思是隻有類物件和子類物件自己能存取到這些變數;以雙下劃線開頭的(_ _a)代表類的私有成員,意思是隻有類物件自己能存取,連子類物件也不能存取到這個資料;以雙下劃線開頭和結尾的(_ _a_ _)代表python裡特殊方法專用的標識,如 _ _init_ _()代表類別建構函式。
如果是一個物件的呼叫,則表示類的名稱,而不是表示物件的名稱;如果當前模組被直接執行(主模組),_ _ name _ _ 儲存的是_ _ main _ _ ;如果當前模組是被呼叫的模組(被匯入),則_ _ name _ _儲存的是py檔名(模組名稱)。
1、表示物件的名稱
>>> class A(object): a = 1 def __init__(self): self.b = 'c' >>> a = A() >>> A.__name__ 'A' >>> a.__name__ Traceback (most recent call last): File "<pyshell#7>", line 1, in <module> a.__name__ AttributeError: 'A' object has no attribute '__name__'
2、表示_ _ main _ _函數的名稱,也就是程式的入口,類似於java中main函數
>>> __name__ '__main__'
3、如果當前模組被其他模組呼叫,則是當前模組的名稱
demo1.py
print(__name__)
demo2.py
import demo1
執行demo2.py檔案後,得到的結果為:
demo1
_ _ bases _ _ 表示類的所有基礎類別;_ _ base _ _ 輸出類繼承的第一個父類別(類的基礎類別); _ _ mro _ _ 輸出類的層次結構。
>>> class A: def __init__(self): self.a = 2 >>> class B(A): def __init__(self): super().__init__() self.b = 3 >>> class C(A): def __init__(self): super().__init__() self.c = 4 >>> class D(B, C): def __init__(self): super().__init__() self.d = 5 >>> D.__bases__ (<class '__main__.B'>, <class '__main__.C'>) >>> D.__base__ <class '__main__.B'> >>> D.__mro__ (<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>)
表示物件的型別,相當於type()函數。
>>> class A: def __init__(self): self.a = 2 >>> a = A() >>> a.__class__ <class '__main__.A'>
表示物件和類的一些屬性,用一個字典儲存起來。
>>> class A: a = 1 b = 2 def __init__(self): self.c = 3 self.d = 4 >>> a = A() >>> a.__dict__ {'c': 3, 'd': 4} >>> A.__dict__ mappingproxy({'__module__': '__main__', 'a': 1, 'b': 2, '__init__': <function A.__init__ at 0x000001CD66F6B8B0>, '__dict__': <attribute '__dict__' of 'A' objects>, '__weakref__': <attribute '__weakref__' of 'A' objects>, '__doc__': None})
表示類的所有直接子類。
>>> class A: def __init__(self): self.a = 2 >>> class B(A): def __init__(self): super().__init__() self.b = 3 >>> class C(A): def __init__(self): super().__init__() self.c = 4 >>> class D(B, C): def __init__(self): super().__init__() self.d = 5 >>> C.__subclasses__() [<class '__main__.D'>] >>> A.__subclasses__() [<class '__main__.B'>, <class '__main__.C'>]
_ _ new _ _ ()是一個靜態方法,用於根據型別建立範例。Python在呼叫 _ _ new _ _ ()方法獲得範例後,會呼叫這個範例的_ _ init _ _ ()方法,然後將最初傳給 _ _ new _ _ ()方法的引數都傳給 _ _ init _ _ ()方法。
_ _ init _ _ ()是一個實體方法,用來在範例建立完成後進行必要的初始化,該方法必須返回None。Python不會自動呼叫父類別的 _ _ init _ _ ()方法,這需要額外的呼叫:
super(C, self). _ _ init _ _ ()
_ _ new _ _ ()至少要有一個引數cls,代表要範例化的類,此引數在範例化時由Python直譯器自動提供;_ _ new _ _ ()必須要有返回值,返回範例化出來的範例,可以return父類別new出來的範例,或直接是object的new出來的範例。
>>> class A(object): def __new__(cls, *args, **kwargs): print("__new__") instance = object.__new__(cls) # 或者 # instance = super().__new__(cls) return instance def __init__(self): print("__init__") >>> a = A() __new__ __init__
在GC之前,Python會呼叫這個物件的 _ _ del _ _ ()方法完成一些終止化工作。如果沒有 _ _ del _ _ ()方法,那麼Python不做特殊的處理;此外,Python無視_ _ del _ _ ()方法的返回值;Python不會自動呼叫父類別的 _ _ del _ _ ()方法,除非顯式呼叫;定義了 _ _ del _ _ ()方法的範例無法參與到迴圈GC中,所以對於這樣的範例應該避免迴圈參照;try/finally語句或with語句可能是比_ _ del _ _()更好的方式。
>>> class A(object): def __new__(cls, *args, **kwargs): print("__new__") instance = super().__new__(cls, *args, **kwargs) return instance def __init__(self): print("__init__") def __del__(self): print("__del__") >>> a = A() __new__ __init__ >>> del a __del__
_ _ repr _ _ ()是一個 ”自我描述“ 的方法,也是Python類中的一個特殊方法,由object物件提供,由於object提供的這個 _ _ repr _ _ 方法總是返回一個物件, ( 類名 + obejct at + 記憶體地址 ),這個值並不能真正實現自我描述的功能,如果你想在自定義類中實現 “自我描述” 的功能,那麼必須重寫 _ _ repr _ _ 方法。_ _ repr _ _ ()方法返回的字串主要是面向直譯器的。
>>> class A(object): def __repr__(self): return "this is a class A" >>> a = A() >>> a this is a class A >>> print(a) this is a class A >>> str(a) 'this is a class A'
_ _ str _ _ ()與_ _ repr _ _ ()返回的詳盡的、準確的、無歧義的物件描述字串不同,_ _ str _ _ ()方法只是返回一個對應物件的簡潔的字串表達形式。如上程式碼所示,當_ _ str _ _ ()缺失時,Python會呼叫_ _ repr _ _ ()方法。
>>> class A(object): def __str__(self): return "this is a class A" >>> a = A() >>> a <__main__.A object at 0x000001CF8C8F9640> >>> print(a) this is a class A >>> str(a) 'this is a class A'
實際上_ _ str _ _ ()只是覆蓋了_ _ repr _ _ ()以得到更友好的使用者顯示。Python內建的str()函數,print(x)語句,都會呼叫物件的_ _ str _ _()方法。
>>> class A(object): def __repr__(self): return "class A" def __str__(self): return "this is a class A" >>> a = A() >>> a class A >>> print(a) this is a class A >>> str(a) 'this is a class A'
定義了該方法的物件可以像函數那樣被呼叫,因此被稱為可呼叫物件。
>>> class A(object): def __init__(self): self.a = 2 def __call__(self, b, *args, **kwargs): c = b + self.a return c >>> a = A() >>> a(3) 5
當兩個物件x、y分別進行x<y、x<=y、x>y、x>=y、x==y和x!=y運算時,會呼叫對應的函數。
>>> class A(object): def __init__(self, b): self.b = b def __lt__(self, other): print("__lt__") return self.b < other.b >>> c = A(3) >>> d = A(4) >>> c < d __lt__ True
三種情形會呼叫__hash__()方法:1. 內建的hash()方法,2.作為字典的鍵時,3.作為集合的成員時;_ _ hash _ _ ()方法應該返回一個32位元長的整數,對與同一個物件,hash()方法應該總是返回相同的值;對於 x == y ,即使二者不屬於相同的型別,只要他們是可雜湊的(hashable),都應該確保得到 hash(x) == hash(y) ;
>>> class A(object): def __init__(self, n): self.n = n def __eq__(self, other): return self.n == other.n def __hash__(self): return random.randint(0, 10) >>> a = A(3) >>> b = A(3) >>> a == b True # 雖然a == b返回結果為True,但是hash(a)和hash(b)返回結果不一樣,所以不能說這兩個物件是相同的。 >>> hash(a) 3 >>> hash(b) 5
_ _ eq _ _()正確的用法:
class A(object): def __init__(self, n): self.n = n def __hash__(self): return hash(id(self)) def __eq__(self, other): if isinstance(other, self.__class__): return hash(id(self))==hash(id(other)) else: return False
通過_ _ hash _ _ 返回一個int值,用來標記這個物件。對於類而言,如果沒有實現_ _ eq _ _ ()和 _ _ hash _ _ ()函數,那麼會自動繼承object._ _ hash _ _()。
到此這篇關於python 特殊屬性及方法詳細解析的文章就介紹到這了,更多相關python 屬性方法內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45