Python3 __dict__dir()とは異なり、オブジェクト内のプライベート属性へのアクセス
10736 ワード
Pythonの下にはすべてのオブジェクトがあり、各オブジェクトには複数の属性(attribute)があり、Pythonは属性に対して統一的な管理案を持っている.
__dict__は辞書で、キーは属性名で、値は属性値です.dir()は関数で、リストリストを返します.dir()は、_を含むオブジェクトのすべての属性を探します.dict__のプロパティdict__dir()のサブセットです.
すべてのオブジェクトが__を持つわけではありませんdict__で行ないます.多くのビルドタイプにはありません.dict__リストのようなプロパティは、dir()でオブジェクトのすべてのプロパティをリストする必要があります. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
上記のコードから分かるように、インスタンスの クラスの
dir()関数
dir()はPythonが提供するAPI関数で、dir()関数は親から継承された属性を含むオブジェクトのすべての属性を自動的に検索します.
1つのインスタンスの 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
結論
dir()関数は、
補足:(クラス内のプライベート属性へのアクセス)
{'age': 2,
'_A__big': 33, 'name': 'xy'}
['_A__big', '__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'age', 'class_f', 'class_var', 'fun', 'name', 'num', 'static_f']
33
結論:
クラスのプライベート属性にもアクセスできます.
__dict__ dir()
の違い:__dict__は辞書で、キーは属性名で、値は属性値です.dir()は関数で、リストリストを返します.dir()は、_を含むオブジェクトのすべての属性を探します.dict__のプロパティdict__dir()のサブセットです.
すべてのオブジェクトが__を持つわけではありませんdict__で行ないます.多くのビルドタイプにはありません.dict__リストのようなプロパティは、dir()でオブジェクトのすべてのプロパティをリストする必要があります.
__dict__
プロパティ __dict__
は、オブジェクト属性を格納するための辞書であり、キーは属性名であり、値は属性の値である.#!/usr/bin/python
# -*- coding: utf-8 -*-
class A(object):
class_var = 1
def __init__(self):
self.name = 'xy'
self.age = 2
@property
def num(self):
return self.age + 10
def fun(self):pass
def static_f():pass
def class_f(cls):pass
if __name__ == '__main__':#
a = A()
print a.__dict__ # {'age': 2, 'name': 'xy'} __dict__
print A.__dict__
'''
A __dict__
{
'__dict__': , # 5
'__module__': '__main__', #
'num': , #
'class_f': , #
'static_f': , #
'class_var': 1,
'fun': , #
'__weakref__': ,
'__doc__': None, #class
'__init__':
}
'''
a.level1 = 3
a.fun = lambda :x
print a.__dict__ #{'level1': 3, 'age': 2, 'name': 'xy','fun': at 0x> }
print A.__dict__ #
A.level2 = 4
print a.__dict__ #{'level1': 3, 'age': 2, 'name': 'xy'}
print A.__dict__ # level2
print object.__dict__
'''
{'__setattr__': ,
'__reduce_ex__': ,
'__new__': ,
.....
'''
上記のコードから分かるように、
__dict__
は、インスタンスに関連するインスタンス属性のみを格納します.インスタンスの__dict__
属性のため、各インスタンスのインスタンス属性は互いに影響しません.__dict__
は、すべてのインスタンスが共有する変数および関数(クラス属性、メソッドなど)を格納し、クラスの__dict__
はその親クラスの属性を含まない.
dir()関数
dir()はPythonが提供するAPI関数で、dir()関数は親から継承された属性を含むオブジェクトのすべての属性を自動的に検索します.
1つのインスタンスの
__dict__
属性は、そのインスタンスのインスタンス属性のセットにすぎず、そのインスタンスのすべての有効な属性を含まない.したがって、オブジェクトのすべての有効なプロパティを取得するにはdir()を使用します.print dir()
print "--------------"
print dir(A)
print "--------------"
print dir(a)
print "--------------"
print dir(object)
"""
['A', '__builtins__', '__doc__', '__file__', '__name__', '__package__', 'a']
--------------
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__',
'__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__',
'__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__',
'__weakref__', 'class_f', 'class_var', 'fun', 'num', 'static_f']
--------------
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__',
'__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__',
'__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__',
'__weakref__', 'age', 'class_f', 'class_var', 'fun', 'name', 'num', 'static_f']
--------------
['__class__', '__delattr__', '__doc__', '__format__', '__getattribute__',
'__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__',
'__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']
"""
# __doc__ , ,
print set(dir(a)) == set(a_dict + A_dict + object_dict) #True
結論
dir()関数は、
__dict__
のプロパティを含むオブジェクトのすべてのプロパティを自動的に探します.__dict__
はdir()のサブセットであり、dir()は__dict__
の属性を含む.補足:(クラス内のプライベート属性へのアクセス)
# -*- coding: utf-8 -*-
class A(object):
class_var = 1
def __init__(self):
self.name = 'xy'
self.age = 2
self.__big=33
if __name__ == '__main__':#
a = A()
print a.__dict__
print dir(a)
print a._A__big
{'age': 2,
'_A__big': 33, 'name': 'xy'}
['_A__big', '__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'age', 'class_f', 'class_var', 'fun', 'name', 'num', 'static_f']
33
結論:
クラスのプライベート属性にもアクセスできます.