- 클래스와 메서드 만들기
>>> class Cookie:
def Cookie_info(self):
print("I'm Cookie!")
>>> Cookie1 = Cookie()
class 를 이용해 Cookie 라는 클래스를 생성하고 함수를 만드는 방법과 같이 def를 이용해 메서드를 생성합니다. 클래스 내부에 정의된 함수인 메서드의 첫번째 인자는 반드시 self여야 합니다. 그 후 클래스에 변수 Cookie1를 할당해주면 Cookie1은 클래스 Cookie의 인스턴스가 됩니다.
여기서 만든 메서드를 호출해보겠습니다.
>>> Cookie1.Cookie_info()
I'm Cookie!
>>> 인스턴스.메서드()
인스턴스를 통해 호출하는 메서드를 인스턴스 메서드라고 부릅니다.
class Cookie:
def Cookie_info(self, shape, color):
self.shape = shape
self.color = color
def print_info(self):
print('내 쿠키의 모양은 {0}고 색깔은 {1}이랍니다.'.format(self.shape, self.color))
메서드 Cookie_info의 인자에 self를 포함해 shape, color를 추가해보았습니다. Cookie_info 메서드 안에 정의한 self.shape 와 self.color 변수는 새롭게 생성된 인스턴스의 shape, color 인자에 입력될 값을 반환합니다. 여기서 클래스를 정의하는 순간에는 생성할 인스턴스의 이름을 모르기 때문에 self라는 단어를 사용합니다.
>>> Cookie1 = Cookie()
>>> Cookie1.Cookie_info('하트', '갈색')
>>> Cookie1.print_info()
내 쿠키의 모양은 하트고 색깔은 갈색이랍니다.
class를 선언한 후 인스턴스 Cookie1를 생성하고 인스턴스의 인수에 shape, color의 값을 넣으면 각 값은 self.shape, self.color에 반환되어 print_info 메서드를 호출하면 그 값이 출력되어 반환됩니다.
- __init__(self)
>>> Cookie1 = HeartCookie()
>>> Cookie1.Cookie_info('하트', '갈색')
>>> Cookie1.print_info()
내 쿠키의 모양은 하트고 색깔은 갈색이랍니다.
위에서는 인스턴스 생성을 한 후 인스턴스에 값을 입력해주었습니다. 그렇다면 인스턴스 생성과 값을 입력하는 것을 한번에 처리하는 방법은 없을까요? 그건 __init__ 메서드를 사용하면 가능합니다.
class tCookie:
def __init__(self, shape, color):
self.shape = shape
self.color = color
def print_info(self):
print('내 쿠키의 모양은 {0}고 색깔은 {1}이랍니다.'.format(self.shape, self.color))
Cookie_info 메서드를 __init__ 메서드를 바꿔주었습니다. 파이썬에서는 __init__(self)와 같은 이름의 메서드를 생성자라고 하며, 파이썬 클래스에서 __로 시작하는 함수는 모두 특별한 메서드(special method)를 의미합니다. 이 메서드를 사용하면 인스턴스를 생성하자마자 화면에 메시지가 출력됩니다. 이는 인스턴스가 생성되는 시점에 자동으로 생성자인 __init__(self) 메서드가 호출되었기 때문입니다.
>>> Cookie1 = Cookie()
Traceback (most recent call last):
File "<pyshell#103>", line 1, in <module>
Cookie1 = HeartCookie()
TypeError: __init__() missing 2 required positional arguments: 'shape' and 'color'
__init 메서드를 사용하고 반환값 없이 인스턴스를 생성하면 위처럼 오류가 발생합니다.
>>> Cookie1 = Cookie('하트', '갈색')
>>> Cookie1.print_info()
내 쿠키의 모양은 하트고 색깔은 갈색이랍니다.
인스턴스 생성과 동시에 메서드 __init__이 호출되므로 인스턴스 생성과 동시에 값을 입력해야 합니다.
- 클래스 네임스페이스
네임스페이스란 변수가 객체를 바인딩할 때 그 둘 사이의 관계를 저장하고 있는 공간입니다. 파이썬의 클래스도 이와 같이 정보가 저장되어있는 독립된 네임스페이스를 가집니다.
class Cookie:
shape = 'Heart'
Cookie 클래스를 정의한다면 이 클래스도 마찬가지로 네임스페이스를 가집니다. 클래스안에 정의된 변수나 메서드는 딕셔너리 형식으로 네임스페이스 안에 저장되게 됩니다.
>>> Cookie.__dict__
mappingproxy({'__module__': '__main__', 'shape': 'Heart', '__dict__': <attribute '__dict__' of 'Cookie' objects>, '__weakref__': <attribute '__weakref__' of 'Cookie' objects>, '__doc__': None})
__dict__ 속성을 이용하면 네임스페이스안의 딕셔너리를 확인할 수 있습니다. 딕셔너리 안에 'shape' : 'Heart' 로 저장되어 있는 것을 볼 수 있습니다.
cookie1 = Cookie()
cookie2 = Cookie()
cookie1, cookie2라는 각 각 다른 인스턴스를 생성해보겠습니다.
>>> id(cookie1)
54136080
>>> id(cookie2)
51483072
id 함수를 이용해 인스턴스의 네임스페이스 주소를 찾아보니 둘 다 다른 곳에 저장되어 있는 것을 확인할 수 있습니다. 똑같은 클래스의 인스턴스라도 각자 독립된 네임스페이스를 갖고 있는 것을 알 수 있습니다.
>>> cookie1.__dict__
{}
>>> cookie2.__dict__
{}
>>> cookie1.shape = 'Star'
>>> cookie1.__dict__
{'shape': 'Star'}
>>> cookie2.shape
'Heart'
각 인스턴스의 네임스페이스를 확인하면 아무것도 들어있지 않습니다. 이 상태에서 cookie1 인스턴스에만 shape라는 변수를 추가하고 네임스페이스를 확인해보았더니 딕셔너리가 생성된 것을 볼 수 있습니다. 그런데 아무것도 들어있지 않은 cookie2의 shape값을 확인해보니 Heart가 출력되는 것을 볼 수 있습니다. 이것은 인스턴스의 네임스페이스를 확인해 해당 값이 없으면 클래스의 네임스페이스로 이동해 값을 조사하고 출력하기 때문입니다.
- 속성(attribute)
파이썬 속성이란 클래스 내부에 포함되어 있는 메서드나 변수를 의미 합니다.
(1) 클래스 속성
클래스 내부의 메서드 단계와 동일한 영역에 위치한 변수이며 클래스 속성에 접근할 경우, 모든 클래스에 동일하게 영향을 미칩니다. self를 사용하지 않고 정의하는 변수입니다. 클래스명.클래스 속성으로 참조가 가능합니다.
class 클래스명:
클래스 속성 = 값
class Cookie:
shape = 'Heart'
flavor = 'Sweet'
color = 'Brown'
def eat(self):
print('Yammy!')
Cookie1 = Cookie()
>>> Cookie1.eat()
Yammy!
>>> Cookie1.shape
'Heart'
위에서 클래스 속성은
shape = 'Heart'
flavor = 'Sweet'
color = 'Brown'
입니다.
(2) 인스턴스 속성
self를 통해 할당된 인스턴스만의 변수를 의미하며 주로 __init__나 메서드 내부에서 할당된 변수를 의미합니다. 인스턴스 내에서 영향을 미치고 인스턴스가 생성될 때나 생성된 후 할당되므로, 인스턴스명.인스턴스 속성으로 참조가 가능합니다.
class 클래스명:
def __init__(self):
self.인스턴스 = 값
class HeartCookie:
def __init__(self):
self.yammy = '맛있다!'
def eat(self):
print(self.yammy)
Cookie1 = HeartCookie()
Cookie1.eat()
result
맛있다!
<참고>
'Python' 카테고리의 다른 글
PEP 8에 따른 Python 코딩 스타일 (0) | 2024.02.13 |
---|---|
[Python] 클래스 비공개 속성 (0) | 2021.05.22 |
[Python] 클래스(class)와 객체(object) (0) | 2021.05.17 |
[Python] 전역변수, 지역변수, global, nonlocal (0) | 2021.05.12 |
[Python] 포매팅을 이용해 숫자 자리 개수 맞추기 (0) | 2021.05.03 |