[패스트캠퍼스python] 클래스의 self의 이해, 클래스, 인스턴스 변수

파이썬 인강 : 클래스의 self의 이해, 클래스, 인스턴스 변수

오늘은 꼭 알아야하면서도 엄청 중요한 개념이라고 할 수 있는 클래스의 self, 클래스, 인스턴스 변수에 대해 공부해보자

1. 클래스의 self의 이해

self 매개변수의 유무에 따른 차이를 아래 예시를 통해 확인해보자

1
2
3
4
5
6
7
8
9
10
print()
class SelfTest: #class SelfTest(): 빈괄호가 있어도되고 없어도 된다
def function1(): # self매개변수없음 = 클래스매서드
print("function1 called!")

def function2(self): # self매개변수있음 = 인스턴스매서드
print(id(self))
print("function2 called!")

self_Test = SelfTest() # 인스턴스 생성

이제 function1을 호출해보자

1
2
3
4
# self_Test.function1()

# 출력값은
TypeError: unction1() takes 0 positional arguments but 1 was given

function1은 클래스매서드이기에 그냥 출력하면 타입에러가 발생한다
아래와 같이 출력해야한다

1
2
3
4
SelfTest.function1()

# 출력값은
function1 called!

잘 출력되는 것을 확인할 수 있다
self매개변수를 선언한 함수는 어떨까?

1
2
3
4
5
6
7
self_Test.function2()
SelfTest.function2()

# 출력값은
function2 called!
TypeError: function2() missing 1 required positional argument: 'self'
#

두번째 방법의 타입에러를 해결하려면 아래 이미지처럼 하면 된다

타입에러 해결

터미널을 확인해보면 id값이 일치하는 것을 확인할 수 있다.

2. 변수 , 인스턴스 변수

클래스변수는 self가 없고 인스턴스변수는 self가 있어야한다
클래스변수는 공용으로 쓸 수 있다

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
print()
class Warehouse:
# 클래스 변수
stock_num = 0

def __init__(self, name):
# 인스턴스 변수
self.name = name
Warehouse.stock_num += 1

def __del__(self):
Warehouse.stock_num -= 1


user1 = Warehouse('Kim')
user2 = Warehouse('Park')

그리고 유저1과 유저2 그리고 웨어하우스의 네임스페이를 확인해보자

1
2
3
4
5
6
7
8
print(user1.__dict__)
print(user2.__dict__)
print(Warehouse.__dict__) # 클래스 네임스페이스 , 클래스 변수를 공유한다.

# 출력물
{'name': 'Kim'}
{'name': 'Park'}
{'__module__': '__main__', 'stock_num': 2, '__init__': <function Warehouse.__init__ at 0x000001ED3D0C79D0>, '__del__': <function Warehouse.__del__ at 0x000001ED3D0C7A60>, '__dict__': <attribute '__dict__' of 'Warehouse' objects>, '__weakref__': <attribute '__weakref__' of 'Warehouse' objects>, '__doc__': None}

이를 통해 유저1과2에는 이름밖에 없고 웨어하우스에 stock_num이 있다는 것을 알수있다
만약 유저안에서 stock_num을 찾는다면 어떻게 될까?

1
2
3
4
5
6
print(user1.stock_num) 
print(user2.stock_num)

# 출력물
2
2

만약 유저를 한명 더 추가한다면 아래와 같이 출력된다

유저추가

네임스페이스안에 이름밖에 없었기때문에 stock_num을 못찾을것같지만 인스턴스는 자신의 네임스페이스에 없으면 클래스의 네임스페이스에서 찾아서 불러온다
이러한 점을 이용하여 연봉인상율같은 계산등에 활용할 수 있다.