關(guān)于__dict__和dir()的區(qū)別和作用請(qǐng)參考這篇文章:
基于Python __dict__與dir()的區(qū)別詳解
說(shuō)下我當(dāng)時(shí)遇到的問(wèn)題:
class Demo: def __init__(self, name, age): self.name = name self.age = age def func(self): print('Hello {0}'.format(self.name))>>> d1 = Demo('Pythoner', 24)>>> hasattr(d1, 'func')True>>> d1.__dict__{'age': 24, 'name': 'Pythoner'}>>dir(d1)[ 'age', 'func', 'name','__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']首先,我們知道實(shí)例方法也可以算作是屬性,通過(guò)hasattr()函數(shù)可以驗(yàn)證.而 __dict__是用來(lái)存儲(chǔ)對(duì)象屬性的一個(gè)字典,但是它的返回值中并沒(méi)有'func'!
再看dir()函數(shù),它會(huì)自動(dòng)尋找一個(gè)對(duì)象的所有屬性(包括從父類(lèi)中繼承的屬性),它的返回值中有'func'.
所以我推測(cè),"實(shí)例方法"并不屬于實(shí)例的"私有"屬性,而是該類(lèi)的所有實(shí)例所共享的屬性!
實(shí)例得到私有屬性需要一個(gè)"私有化"的過(guò)程,就像__init__初始化函數(shù)!
驗(yàn)證:
class Demo2: def __init__(self, name): self.name = name def func(self): print('----get arg country----') self.country = 'China'>>> d2 = Demo2('Pythoner')>>> d2.__dict__{'name': 'Pythoner'}>>> d2.func()----get arg country---->>> d2.__dict__{'country': 'China', 'name': 'Pythoner'}"實(shí)例方法"之所以被稱(chēng)為實(shí)例方法,或者說(shuō)每個(gè)實(shí)例執(zhí)行實(shí)例方法會(huì)因?yàn)楦髯运接袑傩缘牟煌a(chǎn)生不同的結(jié)果,是因?yàn)榉椒ㄖ械膕elf參數(shù).
實(shí)例在執(zhí)行實(shí)例方法時(shí)會(huì)在其所屬的類(lèi)中尋找該方法,然后通過(guò)self參數(shù)將實(shí)例本身傳遞進(jìn)去,實(shí)例的私有屬性就一并進(jìn)行了傳遞.通過(guò)self參數(shù)就實(shí)現(xiàn)了實(shí)例和方法的綁定.
總結(jié)
以上就是本文關(guān)于淺談Python由__dict__和dir()引發(fā)的一些思考的全部?jī)?nèi)容,希望對(duì)大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站:淺談使用Python變量時(shí)要避免的3個(gè)錯(cuò)誤、深入理解Python中的*重復(fù)運(yùn)算符等,如有不足之處,歡迎留言指出。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注