關于__dict__和dir()的區別和作用請參考這篇文章:
說下我當時遇到的問題:
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__']首先,我們知道實例方法也可以算作是屬性,通過hasattr()函數可以驗證.而 __dict__是用來存儲對象屬性的一個字典,但是它的返回值中并沒有'func'!
再看dir()函數,它會自動尋找一個對象的所有屬性(包括從父類中繼承的屬性),它的返回值中有'func'.
所以我推測,"實例方法"并不屬于實例的"私有"屬性,而是該類的所有實例所共享的屬性!
實例得到私有屬性需要一個"私有化"的過程,就像__init__初始化函數!
驗證:
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'}"實例方法"之所以被稱為實例方法,或者說每個實例執行實例方法會因為各自私有屬性的不同而產生不同的結果,是因為方法中的self參數.
實例在執行實例方法時會在其所屬的類中尋找該方法,然后通過self參數將實例本身傳遞進去,實例的私有屬性就一并進行了傳遞.通過self參數就實現了實例和方法的綁定.
總結
以上就是本文關于淺談Python由__dict__和dir()引發的一些思考的全部內容,希望對大家有所幫助。如有不足之處,歡迎留言指出。
新聞熱點
疑難解答