일반적으로 Python에서 클래스 인스턴스 속성에 대한 액세스 규칙은 비교적 직관적입니다.
그러나 특히 C++ 및 Java 프로그래머에게는 아직 직관적이지 않은 부분이 있습니다.
여기서 다음 사항을 이해해야 합니다.
1. Python은 동적 언어이므로 모든 엔터티가 속성을 동적으로 추가하거나 삭제할 수 있습니다.
2. 클래스는 범위를 정의합니다.
3. 클래스 인스턴스도 해당 클래스에서 정의한 범위와 다른 범위를 도입합니다.
4. 클래스 인스턴스에서 속성을 찾을 때는 먼저 인스턴스 자체의 범위에서 검색합니다. 찾을 수 없으면 클래스 정의의 범위에서 검색합니다.
5. 클래스 인스턴스 속성에 값을 할당하면 속성은 실제로 클래스 인스턴스에서 정의한 범위에 추가되며(아직 존재하지 않는 경우), 클래스 인스턴스에 정의된 속성에는 영향을 미치지 않습니다. 해당 클래스. 이름이 같은 속성입니다.
위 사항에 대한 이해를 돕기 위해 예를 살펴보겠습니다.
class A:
cls_i = 0
cls_j = {}
def __init__(self):
self.instance_i = 0
self.instance_j = {}
여기서 먼저 클래스 A의 인스턴스 a를 정의합니다. , 그런 다음 클래스 A의 범위와 인스턴스 a의 범위에 무엇이 있는지 살펴봅니다.
>>> a = A()
>>> a.__dict__
{'instance_j': {}, 'instance_i': 0}
>>> A.__dict__
{'__init__': , '__module__': '__main__', ' cls_i ': 0, 'cls_j': {}, '__doc__': None}
a의 범위에는 인스턴스_i와 인스턴스_j가 있고, A의 범위에는 cls_i와 cls_j가 있음을 알 수 있습니다.
이름 조회가 어떻게 이루어지는지 살펴보겠습니다.
>>> a.cls_i
0
>>> a.instance_i
>> >0
cls_i를 검색하면 인스턴스 a의 범위에 없지만, 인스턴스_i를 검색하면 A의 범위에서 바로 찾을 수 있습니다. 범위에서 찾아보세요.
인스턴스 a를 통해 cls_i의 값을 수정하려고 하면 어떻게 되나요?
>>> a.cls_i = 1
>>> a.__dict__
{'instance_j': {}, 'cls_i': 1, 'instance_i': 0}
>>> A.__dict__
{'__init__': , ' __module__' : '__main__', 'cls_i': 0, 'cls_j': {}, '__doc__': 없음}
a의 범위에 추가 cls_i 속성이 있고 그 값은 다음과 같습니다. 1; 동시에 A 범위의 cls_i 속성 값이 여전히 0이라는 것을 확인했습니다. 실제로 인스턴스 속성을 추가하고 클래스 속성을 수정하지 않았습니다.
인스턴스 a를 통해 cls_j의 데이터를 조작하면 어떻게 됩니까(cls_j 자체가 아님):
>>> a.cls_j['a'] = 'a'
>>> a.__dict__
{'instance_j': {}, 'cls_i': 1, 'instance_i': 0}
>>> A.__dict__
{'__init__': , '__module__': '__main__', 'cls_i': 0, 'cls_j': {'a': 'a'}, '__doc__': None}
우리는 할 수 있습니다 a의 범위는 변경되지 않았지만 A의 범위는 일부 변경되었으며 cls_j의 데이터는 변경되었습니다.
인스턴스 범위를 변경해도 클래스의 다른 인스턴스에는 영향을 미치지 않지만, 클래스 범위를 변경하면 이전에 생성된 인스턴스를 포함하여 클래스의 모든 인스턴스에 영향을 미칩니다.
> >> A.cls_k = 0
>>> i.cls_k
0