程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

Python3教程: 由__dict__和dir()引發的一些問題

編輯:Python

說下我當時遇到的問題:

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__初始化函數!

驗證:

''' 學習中遇到問題沒人解答?小編創建了一個Python學習交流QQ群:857662006 尋找有志同道合的小伙伴,互幫互助,群裡還有不錯的視頻學習教程和PDF電子書! '''
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參數就實現了實例和方法的綁定.


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved