파이썬 인강 : 클래스의 self의 이해, 클래스, 인스턴스 변수
오늘은 꼭 알아야하면서도 엄청 중요한 개념이라고 할 수 있는 클래스의 self, 클래스, 인스턴스 변수에 대해 공부해보자
1. 클래스의 self의 이해
self 매개변수의 유무에 따른 차이를 아래 예시를 통해 확인해보자
1 2 3 4 5 6 7 8 9 10
| print() class SelfTest: def function1(): print("function1 called!")
def function2(self): print(id(self)) print("function2 called!")
self_Test = SelfTest()
|
이제 function1을 호출해보자
1 2 3 4
|
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을 못찾을것같지만 인스턴스는 자신의 네임스페이스에 없으면 클래스의 네임스페이스에서 찾아서 불러온다
이러한 점을 이용하여 연봉인상율같은 계산등에 활용할 수 있다.