허용 된 답변이 발견되었지만 약간의 설명을 추가하고 싶습니다.
작은 운동을하자
우선 다음과 같이 클래스를 정의하십시오.
class A:
temp = 'Skyharbor'
def __init__(self, x):
self.x = x
def change(self, y):
self.temp = y
그래서 우리는 여기에 무엇을해야합니까?
- 우리는
temp
문자열 인 속성 을 가진 매우 간단한 클래스를 가지고 있습니다
__init__
설정 하는 방법self.x
- 변경 방법 세트
self.temp
지금까지 꽤 직설적입니까? 이제이 수업을 시작해 봅시다. 이 클래스를 먼저 초기화 해 봅시다 :
a = A('Tesseract')
이제 다음을 수행하십시오.
>>> print(a.temp)
Skyharbor
>>> print(A.temp)
Skyharbor
글쎄, a.temp
예상대로 작동했지만 어떻게 A.temp
작동 했습니까? temp는 클래스 속성이기 때문에 잘 작동했습니다. 파이썬의 모든 것은 객체입니다. 여기 A는 class의 객체이기도합니다 type
. 따라서 속성 temp는 A
클래스가 보유한 속성 이므로 temp의 값을 A
(를 통해가 아닌) 통해 a
변경하면 변경된 값이 모든 A
클래스 의 인스턴스에 반영됩니다 . 계속해서 해봅시다 :
>>> A.temp = 'Monuments'
>>> print(A.temp)
Monuments
>>> print(a.temp)
Monuments
흥미롭지 않습니까? 그리고 점에 유의 id(a.temp)
하고 id(A.temp)
여전히 동일합니다 .
모든 파이썬 객체 __dict__
에는 속성 목록이 포함 된 속성 이 자동으로 부여됩니다 . 예제 객체에 대해이 사전에 포함 된 내용을 조사해 보겠습니다.
>>> print(A.__dict__)
{
'change': <function change at 0x7f5e26fee6e0>,
'__module__': '__main__',
'__init__': <function __init__ at 0x7f5e26fee668>,
'temp': 'Monuments',
'__doc__': None
}
>>> print(a.__dict__)
{x: 'Tesseract'}
참고 temp
속성 사이에 나열되어 A
있는 동안 클래스의 속성 x
인스턴스에 대해 나열됩니다.
따라서 a.temp
인스턴스에 대해 나열되지 않은 경우 의 정의 된 값을 얻는 방법은 무엇입니까 a
? 이것이 바로 __getattribute__()
방법 의 마술입니다 . 파이썬에서 점으로 구분 된 구문은이 메소드를 자동으로 호출하므로 우리가 작성할 때 a.temp
파이썬이 실행 a.__getattribute__('temp')
됩니다. 이 메소드는 속성 조회 조치를 수행합니다. 즉, 다른 위치를보고 속성의 값을 찾습니다.
__getattribute__()
검색 의 표준 구현은 먼저 객체 의 내부 사전 ( dict )과 객체 자체의 유형을 차례로 검색합니다. 이 경우 a.__getattribute__('temp')
먼저 실행 a.__dict__['temp']
한 다음a.__class__.__dict__['temp']
자 이제 우리의 change
방법을 사용하자 :
>>> a.change('Intervals')
>>> print(a.temp)
Intervals
>>> print(A.temp)
Monuments
글쎄 지금 우리가 사용하는 것으로 self
, print(a.temp)
우리는 다른 값을 제공합니다 print(A.temp)
.
이제 id(a.temp)
와 를 비교하면 id(A.temp)
서로 다릅니다.
list
속성 이름으로 사용하지 마십시오 .list
새 목록을 구성하는 buil-in 함수입니다. 대문자로 이름 클래스를 작성해야합니다.