은 당신이 예를 속성을 할당 할 때, 해당 인스턴스의 개인 사전 (__dict__
)가 업데이트 될 때,이다,하지만 클래스의 __dict__
. 전자는 요청 된 속성의 검색에 우선 순위를 가지며, 처음 몇 줄에서는 항상 object2
에 대해 찾을 수없는 경우 클래스의 __dict__
을 사용하여 속성을 찾습니다. 특히
:
속성 할당 및 삭제 인스턴스의 사전, 결코 클래스의 사전을 업데이트합니다. 클래스에 __setattr__()
또는 __delattr__()
메서드가있는 경우이 메서드는 인스턴스 사전을 직접 업데이트하는 대신 호출됩니다. .
(강조 광산 the Python documentation on the standard type hierarchy in the data model에서, 당신은 서브 섹션 "클래스 인스턴스", 두 번째 단락을 찾아야합니다 단락을이 인스턴스와 거래하기 전에 속성 조회 순서를 전체 하위 섹션과 하나 전합니다.. , "사용자 정의 클래스"는 컨셉을 얻기 위해 읽는 것이 좋을 수 있으며, 아마도 다소 응축되기 때문에 몇 번이나 읽을 수 있습니다.)는 종종 저 아래에 무슨 일이 일어나고 있는지 이해하는 데 도움이 무엇
, 클래스,이 경우 ID와() 관련 인스턴스의 __dict__
속성을 인쇄하는 것입니다 및 속성. 이 id는 당신이 같은 객체를보고 있다는 것을 보장하지 않지만 CPython을 사용할 때 일반적으로 나를 위해 일해 왔습니다.
당신이 인쇄 조정 코드 :
from __future__ import print_function
class MyClass(object):
value = 5
object1 = MyClass()
object2 = MyClass()
print(object1.value, id(object1.value), object1.__dict__)
print(object2.value, id(object2.value), object2.__dict__)
print(MyClass.value, id(MyClass.value), MyClass.__dict__)
object1.value = 6
print(object1.value, id(object1.value), object1.__dict__)
print(object2.value, id(object2.value), object2.__dict__)
print(MyClass.value, id(MyClass.value), MyClass.__dict__)
MyClass.value = 10
print(object1.value, id(object1.value), object1.__dict__)
print(object2.value, id(object2.value), object2.__dict__)
print(MyClass.value, id(MyClass.value), MyClass.__dict__)
과 (편안함을 읽기 위해 삽입 된 몇 가지 여분의 줄 바꿈과 공백) 내가 얻을 출력 :
5 4325640816 {}
5 4325640816 {}
5 4325640816 {'__doc__': None, '__weakref__': <attribute '__weakref__' of 'MyClass' objects>,
'__dict__': <attribute '__dict__' of 'MyClass' objects>,
'__module__': '__main__', 'value': 5}
6 4325640848 {'value': 6}
5 4325640816 {}
5 4325640816 {'__doc__': None, '__weakref__': <attribute '__weakref__' of 'MyClass' objects>,
'__dict__': <attribute '__dict__' of 'MyClass' objects>,
'__module__': '__main__', 'value': 5}
6 4325640848 {'value': 6}
10 4325640976 {}
10 4325640976 {'__doc__': None, '__weakref__': <attribute '__weakref__' of 'MyClass' objects>,
'__dict__': <attribute '__dict__' of 'MyClass' objects>,
'__module__': '__main__', 'value': 10}
ID입니다은별로 달라집니다 실행 및 시스템과 편리하게 여기서 'value'
은 항상 MyClass.__dict__
에 마지막으로 인쇄되지만 어떤 속성이 변경되고 어떤 것이 실제로 동일하며 __dict__
속성이 업데이트되는 방식을 확인할 수 있습니다.
(참고 :... 하지이 __dict__
자신을 속성 수정하지 일반적으로되지 않는 다른 방법을 내장하여 봅시다 중 하나를 읽고 기능이 그것을 처리하기 위해, 어떤 방법으로 그것을 사용하지 않는)
를