2019年3月6日 星期三

[ Python 文章收集 ] Python __dict__ , dir() 與 vars()

Source From Here 
Preface 
Python 下一切皆對象,每個對像都有多個屬性 (attribute),Python 對屬性有一套統一的管理方案。__dict__ 與 dir() 的區別: 
1. dir() 是一個函數,返回的是list;
2. __dict__ 是一個字典,鍵為屬性名,值為屬性值;
3. dir() 用來尋找一個對象的所有屬性,包括 __dict__ 中的屬性,__dict__ 是 dir() 的子集;

並不是所有對像都擁有 __dict__ 屬性。許多內建類型就沒有 __dict__ 屬性,如 list,此時就需要用 dir() 來列出對象的所有屬性。 

__dict__ 屬性 
__dict__ 是用來存儲對象屬性的一個字典,其鍵為屬性名,值為屬性的值. 假設我們有 class A 如下: 
  1. class A(object):  
  2.     class_var = 1  
  3.     def __init__(self):  
  4.         self.name = 'xy'  
  5.         self.age = 2  
  6.   
  7.     @property  
  8.     def num(self):  
  9.         return self.age + 10  
  10.   
  11.     def fun(self):pass  
  12.   
  13.     @staticmethod  
  14.     def static_f():pass  
  15.   
  16.     @classmethod  
  17.     def class_f(cls):pass  
接著可以如下測試: 
>>> a = A()
>>> print(a.__dict__)
{'name': 'xy', 'age': 2}

>>> from pprint import pprint
>>> pprint(A.__dict__)
  1. mappingproxy({'__dict__': '__dict__' of 'A' objects>,  
  2.               '__doc__': None,  
  3.               '__init__': 0x7fb6a8fe6598>,  
  4.               '__module__''test',  
  5.               '__weakref__': '__weakref__' of 'A' objects>,  
  6.               'class_f': 0x7fb6a1182630>,  
  7.               'class_var'1,  
  8.               'fun': 0x7fb6a8fe66a8>,  
  9.               'num': 0x7fb6a117d818>,  
  10.               'static_f': 0x7fb6a11825f8>})  

從上述代碼可知, 
1. 實例的 __dict__ 僅存儲與該實例相關的實例屬性,正是因為實例的 __dict__ 屬性,每個實例的實例屬性才會互不影響。
2. 類的 __dict__ 存 儲所有實例共享的變量和函數 (類屬性,方法等),類的 __dict__ 並不包含其父類的屬性。

dir() 函數 
​dir() 是 Python 提供的一個API函數,​dir() 函數會自動尋找一個對象的所有屬性 (包括從父類中繼承的屬性)。​一個實例的 __dict__ 屬性僅僅是那個實例的實例屬性的集合,並不包含該實例的所有有效屬性。所以如果想獲取一個對象所有有效屬性,應使用 ​dir()。簡單測試如下: 
>>> pprint(dir(a))
['__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__',
'age',
'class_f',
'class_var',
'fun',
'name',
'num',
'static_f']

vars() 函數 
vars() 函數返回對象 object 的屬性和屬性值的字典對象. 測試如下: 
>>> vars(a)
{'name': 'xy', 'age': 2}

>>> a.address = 'test address'
>>> vars(a)
{'name': 'xy', 'age': 2, 'address': 'test address'}
>>> pprint(vars()) # 返回目前名稱空間下的資料
{'A': ,
'__annotations__': {},
'__builtins__': ,
'__doc__': None,
'__loader__': ,
'__name__': '__main__',
'__package__': None,
'__spec__': None,
'a': ,
'pprint': }


Supplement 
Python's Instance, Class, and Static Methods Demystified

沒有留言:

張貼留言

[Git 常見問題] error: The following untracked working tree files would be overwritten by merge

  Source From  Here 方案1: // x -----删除忽略文件已经对 git 来说不识别的文件 // d -----删除未被添加到 git 的路径中的文件 // f -----强制运行 #   git clean -d -fx 方案2: 今天在服务器上  gi...