摘要:與通常認(rèn)為實例方法是的,而類方法是的,這種說法也沒錯,只是對于不同類型變量來說,結(jié)果是不同的測試一下結(jié)果顯示的都是直接從類訪問,結(jié)果這個實例方法顯示的是。可以知道的意義并不是始終不變的,對于不同的對象來說意義并不一樣。
bound與unbound
通常認(rèn)為實例方法是bound的,而類方法是unbound的,這種說法也沒錯,只是對于不同類型變量來說,結(jié)果是不同的
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
測試一下, 結(jié)果顯示的都是bound method
>>> a = A() >>> a.fs> >>> a.fc >
直接從類訪問,結(jié)果fs這個實例方法顯示的是unbound??梢灾纀ound的意義并不是始終不變的,對于不同的對象來說意義并不一樣。
>>> 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調(diào)用靜態(tài)方法會出錯(TypeError),因為實例對方法的調(diào)用提供了self參數(shù),但sm是沒有參數(shù)的。但是這提供了另一種思路)比如在python的多進程編程中,進程跑的函數(shù)如果是實例函數(shù)的會因為無法序列化而失敗,但如果是staticmethod就沒有問題,靜態(tài)函數(shù)的本質(zhì)其實也就是普通函數(shù)。
所以可以這樣
class B(object): @staticmethod def run(inst): inst.foo() def foo(self): print "foo" b = B() B.run(b)
在2.x中區(qū)分實例函數(shù)和類函數(shù)可以用im_self
>>> A.fs.im_self None >>> A.fc.im_self
至于通過實例引用方法時的im_self的值,大家自己可以探索下
獲取類中所有定義的方法使用dir函數(shù)
>>> 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
這個除了函數(shù)名的字符串以外,連對象的type也得到了,結(jié)果更加詳細(xì)
>>> inspect.getmembers(A) [("_A__private",判斷某個屬性是否可調(diào)用), ("__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))
獲得一個對象中所有可調(diào)用的方法
[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函數(shù)用在C的實例上,確實會返回["cherry"],但dir(C)還是能得到類中所有屬性,有點掩耳盜鈴的感覺,待繼續(xù)研究
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/45409.html
摘要:盡管和非常相似,但在用法上依然有一些明顯的區(qū)別。所以,從靜態(tài)方法的使用中可以看出,我們不會訪問到本身它基本上只是一個函數(shù),在語法上就像一個方法一樣,但是沒有訪問對象和它的內(nèi)部字段和其他方法,相反會訪問,會訪問。 python staticmethod and classmethod Though classmethod and staticmethod are quite simil...
摘要:本篇主要總結(jié)中綁定方法對象和未綁定方法對象的區(qū)別和聯(lián)系。在中使用描述器有翻譯的鏈接來表示具有綁定行為的對象屬性,使用描述器協(xié)議方法來控制對具有綁定行為屬性的訪問,這些描述器協(xié)議方法包括和。其中通過限定的必須使用實例才能調(diào)用。 本篇主要總結(jié)Python中綁定方法對象(Bound method object)和未綁定方法對象(Unboud method object)的區(qū)別和聯(lián)系。主要目的...
摘要:在類的成員函數(shù)中訪問實例屬性需要以為前綴。但提供一種對私有成員的訪問方式對象名類名私有成員類中保護對象類中系統(tǒng)定義的特殊成員類中私有成員多態(tài)列表項目 Python學(xué)習(xí)第一天 類與對象 python的成員函數(shù)在,默認(rèn)有一個self參數(shù),這是類的成員函數(shù)與普通函數(shù)的主要區(qū)別,self,位于參數(shù)列表的開頭,self也代表類的實例(對象)自身,可以使用self引用類中的屬性和成員函數(shù)。在...
摘要:原鏈接中的元類是什么類也是對象在理解元類之前,需要掌握中類概念。事實上,是中用于創(chuàng)建所有類的元類。類本身是元類的對象在中,除了,一切皆對象,一切都是類或者元類的對象。事實上是自己的元類, 學(xué)習(xí)契機 項目中使用Elasticsearch(ES)存儲海量業(yè)務(wù)數(shù)據(jù),基于ES向外提供的API進一層封裝,按需處理原始數(shù)據(jù)提供更精確、更多樣化的結(jié)果。在研究這一層的代碼時接觸到@six.add_me...
摘要:在對象接口后包裝其實現(xiàn)的細(xì)節(jié),從而隔離了代碼的修改對用戶產(chǎn)生的影響。類提供了一個新的本地作用域,最小化了變量名沖突。類其實并沒有結(jié)束,不過本講座到此對類暫告一段。 前面對類的有關(guān)內(nèi)容已經(jīng)描述不少了,其實話題遠遠沒有結(jié)束,不過對于初學(xué)者,掌握這些已經(jīng)算是入門,在以后的實踐中,還需要進行體會和感悟。 這幾天和幾個朋友以各種途徑討論過OOP的相關(guān)問題,他們是:令狐蟲、Frank、晉劍、小馮...
閱讀 1603·2021-09-30 09:47
閱讀 3609·2021-09-22 15:05
閱讀 2842·2021-08-30 09:44
閱讀 3626·2019-08-30 15:55
閱讀 1377·2019-08-30 13:08
閱讀 1332·2019-08-29 16:40
閱讀 557·2019-08-29 12:45
閱讀 1393·2019-08-29 11:25