출처 : https://www.pythontutorial.net/python-oop/python-instance-variables/
Introduction to the Python instance variables
Python에서 클래스 변수는 클래스에 바인딩되고 인스턴스 변수는 클래스의 속성 인스턴스에 바인딩됩니다. 인스턴스 변수는 인스턴스 속성이라고도 합니다.
다음은 두 개의 클래스 변수가 있는 HtmlDocument 클래스를 정의합니다.
from pprint import pprint
class HtmlDocument:
version = 5
extension = 'html'
pprint(HtmlDocument.__dict__)
print(HtmlDocument.extension)
print(HtmlDocument.version)
Output:
mappingproxy({'__dict__': <attribute '__dict__' of 'HtmlDocument' objects>,
'__doc__': None,
'__module__': '__main__',
'__weakref__': <attribute '__weakref__' of 'HtmlDocument' objects>,
'extension': 'html',
'version': 5})
html
5
클래스에는 extension과 version이라는 두 가지 클래스 변수가 있습니다. 파이썬은 이 두 변수를 __dict__ 속성에 저장합니다.
클래스를 통해 클래스 변수에 액세스하면 Python은 클래스의 __dict__에서 클래스 변수를 찾습니다.
다음은 HtmlDocument 클래스의 새 인스턴스를 만듭니다.
home = HtmlDocument()
home은 HtmlDocument 클래스의 인스턴스입니다 . 인스턴스는 자신의 자체 __dict__ 속성이 있습니다.
home = HtmlDocument()
print(home.__dict__) # {}
# 개체에 초기화할 것이 없으므로 빈 dict이다.
home.__dict__는 HtmlDocument.__dict__ 가 HtmlDocument 클래스의 클래스 변수를 저장하는 것처럼 home 객체 의 인스턴스 변수를 저장합니다.
클래스의 __dict__ 속성과 달리 인스턴스의 __dict__ 속성 형식은 사전입니다. 예를 들어:
print(type(HtmlDocument.__dict__)) # <class 'mappingproxy'>
print(type(home.__dict__)) # dict
사전은 mutable(변경 가능)이기 때문에 instance 속성은 변경이 가능하다.
Python은 클래스의 인스턴스에서 클래스 변수에 액세스를 허용합니다. 예를 들어:
print(home.extension)
print(home.version)
이 경우 Python은 먼저 변수 extension, version 을 home.__dict__ 에서 찾습니다 . 거기에서 그들을 찾지 못하면 class로 올라가 HtmlDocument.__dict__에서 검색합니다.
그러나 파이썬이 인스턴스의 __dict__ 변수에서 변수를 찾으면 클래스의 __dict__에서 검색을 멈춘다.
다음은 home 객체의 version 변수를 정의합니다.
home.version = 6
파이썬은 versioon 변수를 home 객체의 __dict__ 속성에 추가합니다:
이제 __dict__에는 하나의 인스턴스 변수가 포함됩니다.
home.version = 6
print(home.__dict__) # {'version': 6}
print(home.version) # 6
클래스 변수를 변경하면 이러한 변경 사항이 클래스의 인스턴스에도 반영됩니다. ( class 속성은 공유되므로 )
HtmlDocument.media_type = 'text/html'
print(home.media_type) # text/html
Initializing instance variables
실제로는 __init__ 메서드에서 클래스의 모든 인스턴스에 대한 인스턴스 변수를 초기화합니다.
예를 들어, 다음은 두 개의 인스턴스 변수 name, contents가 있는 HtmlDocument 클래스를 다시 정의합니다.
class HtmlDocument:
version = 5
extension = 'html'
def __init__(self, name, contents):
self.name = name
self.contents = contents
HtmlDocument의 새 인스턴스를 만들 때 다음과 같이 해당 인수를 전달해야합니다.
blank = HtmlDocument('Blank', '')
Summary
- 인스턴스 변수는 클래스의 지정 인스턴스에 바인딩됩니다.
- Python은 인스턴스 변수를 인스턴스의 __dict__ 속성에 저장합니다.
각 인스턴스에는 고유한 __dict__ 속성, key를 갖으므로 각각 다를 수 있습니다. - 인스턴스를 통해 변수에 액세스하면 Python은 인스턴스의 __dict__ 속성에서 변수를 찾습니다. 변수를 찾을 수 없으면 올라가서 클래스의 __dict__ 속성에서 찾습니다.
'Python Object-oriented Programming' 카테고리의 다른 글
__str__ Method (0) | 2023.04.03 |
---|---|
Private Attributes (0) | 2023.04.03 |
__init__ Method (0) | 2023.04.03 |
Class Methods (0) | 2023.04.02 |
Methods (0) | 2023.04.02 |
댓글