摘要:與通常認為實例方法是的,而類方法是的,這種說法也沒錯,只是對于不同類型變量來說,結果是不同的測試一下結果顯示的都是直接從類訪問,結果這個實例方法顯示的是??梢灾赖囊饬x并不是始終不變的,對于不同的對象來說意義并不一樣。
bound與unbound
通常認為實例方法是bound的,而類方法是unbound的,這種說法也沒錯,只是對于不同類型變量來說,結果是不同的
class A(object): """test class""" _instance = None def __private(self): pass def _protect(self): pass def fs(self): pass @staticmethod def sm(): pass @classmethod def fc(cls): pass
測試一下, 結果顯示的都是bound method
>>> a = A() >>> a.fs> >>> a.fc >
直接從類訪問,結果fs這個實例方法顯示的是unbound。可以知道bound的意義并不是始終不變的,對于不同的對象來說意義并不一樣。
>>> A.fs>>> A.fc >
python里面類方法和實例方法可以等價變換
a.fs() # equals A.fs(a)
從描述器的角度看
>>> A.__dict__["fs"].__get__(None, A)>>> A.__dict__["fs"].__get__(a, A) > >>> A.__dict__["fc"].__get__(None, A) >
不過實例a調用靜態方法會出錯(TypeError),因為實例對方法的調用提供了self參數,但sm是沒有參數的。但是這提供了另一種思路)比如在python的多進程編程中,進程跑的函數如果是實例函數的會因為無法序列化而失敗,但如果是staticmethod就沒有問題,靜態函數的本質其實也就是普通函數。
所以可以這樣
class B(object): @staticmethod def run(inst): inst.foo() def foo(self): print "foo" b = B() B.run(b)
在2.x中區分實例函數和類函數可以用im_self
>>> A.fs.im_self None >>> A.fc.im_self
至于通過實例引用方法時的im_self的值,大家自己可以探索下
獲取類中所有定義的方法使用dir函數
>>> dir(A) ["_A__private", "__class__", "__delattr__", "__dict__", "__doc__", "__format__", "__getattribute__", "__hash__", "__init__", "__module__", "__new__", "__reduce__", "__reduce_ex__", "__repr__", "__setattr__", "__sizeof__", "__str__", "__subclasshook__", "__weakref__", "_instance", "_protect", "fc", "fs", "sm"]
2 使用inspect.getmembers
這個除了函數名的字符串以外,連對象的type也得到了,結果更加詳細
>>> inspect.getmembers(A) [("_A__private",判斷某個屬性是否可調用), ("__class__", type), ("__delattr__", ), ("__dict__", , "__dict__": , "__doc__": "test class", "__module__": "__main__", "__weakref__": , "_instance": None, "_protect": , "fc": , "fs": , "sm": }>), ("__doc__", "test class"), ("__format__", ), ("__getattribute__", ), ("__hash__", ), ("__init__", ), ("__module__", "__main__"), ("__new__", ), ("__reduce__", ), ("__reduce_ex__", ), ("__repr__", ), ("__setattr__", ), ("__sizeof__", ), ("__str__", ), ("__subclasshook__", ), ("__weakref__", ), ("_instance", None), ("_protect", ), ("fc", >), ("fs", ), ("sm", )]
a = A() callable(getattr(a, "testattr", None))
獲得一個對象中所有可調用的方法
[method for method in dir(object) if callable(getattr(object, method))]隱藏屬性
重寫__dict__或者__dir__
class C(object): __dict__ = {} def __dir__(self): return ["cherry"]
注意,這里的__dict__不是類的,是實例的,類的__dict__是不可寫的,不信可以試試
__dir__很奇怪,如果dir函數用在C的實例上,確實會返回["cherry"],但dir(C)還是能得到類中所有屬性,有點掩耳盜鈴的感覺,待繼續研究
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/45409.html
摘要:盡管和非常相似,但在用法上依然有一些明顯的區別。所以,從靜態方法的使用中可以看出,我們不會訪問到本身它基本上只是一個函數,在語法上就像一個方法一樣,但是沒有訪問對象和它的內部字段和其他方法,相反會訪問,會訪問。 python staticmethod and classmethod Though classmethod and staticmethod are quite simil...
摘要:本篇主要總結中綁定方法對象和未綁定方法對象的區別和聯系。在中使用描述器有翻譯的鏈接來表示具有綁定行為的對象屬性,使用描述器協議方法來控制對具有綁定行為屬性的訪問,這些描述器協議方法包括和。其中通過限定的必須使用實例才能調用。 本篇主要總結Python中綁定方法對象(Bound method object)和未綁定方法對象(Unboud method object)的區別和聯系。主要目的...
摘要:在類的成員函數中訪問實例屬性需要以為前綴。但提供一種對私有成員的訪問方式對象名類名私有成員類中保護對象類中系統定義的特殊成員類中私有成員多態列表項目 Python學習第一天 類與對象 python的成員函數在,默認有一個self參數,這是類的成員函數與普通函數的主要區別,self,位于參數列表的開頭,self也代表類的實例(對象)自身,可以使用self引用類中的屬性和成員函數。在...
摘要:原鏈接中的元類是什么類也是對象在理解元類之前,需要掌握中類概念。事實上,是中用于創建所有類的元類。類本身是元類的對象在中,除了,一切皆對象,一切都是類或者元類的對象。事實上是自己的元類, 學習契機 項目中使用Elasticsearch(ES)存儲海量業務數據,基于ES向外提供的API進一層封裝,按需處理原始數據提供更精確、更多樣化的結果。在研究這一層的代碼時接觸到@six.add_me...
摘要:在對象接口后包裝其實現的細節,從而隔離了代碼的修改對用戶產生的影響。類提供了一個新的本地作用域,最小化了變量名沖突。類其實并沒有結束,不過本講座到此對類暫告一段。 前面對類的有關內容已經描述不少了,其實話題遠遠沒有結束,不過對于初學者,掌握這些已經算是入門,在以后的實踐中,還需要進行體會和感悟。 這幾天和幾個朋友以各種途徑討論過OOP的相關問題,他們是:令狐蟲、Frank、晉劍、小馮...
閱讀 1600·2021-09-30 09:47
閱讀 3590·2021-09-22 15:05
閱讀 2835·2021-08-30 09:44
閱讀 3620·2019-08-30 15:55
閱讀 1370·2019-08-30 13:08
閱讀 1325·2019-08-29 16:40
閱讀 549·2019-08-29 12:45
閱讀 1385·2019-08-29 11:25