Python3 __dict__dir()とは異なり、オブジェクト内のプライベート属性へのアクセス

10736 ワード

Pythonの下にはすべてのオブジェクトがあり、各オブジェクトには複数の属性(attribute)があり、Pythonは属性に対して統一的な管理案を持っている.__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__': , 
     .....
    '''
  • 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

  • 上記のコードから分かるように、
  • インスタンスの__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
  • 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()関数は、__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
    結論:
    クラスのプライベート属性にもアクセスできます.