일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 파이썬
- 카톡
- S3
- 중급파이썬
- wetube
- EC2
- Props
- 튜플
- NeXT
- react
- socket io
- pandas
- node
- lambda
- RDS
- flask
- AWS
- docker
- merge
- dict
- Vue
- TypeScript
- crud
- async
- git
- SSA
- MongoDB
- 채팅
- SAA
- Class
- Today
- Total
초보 개발자
파이썬 인스턴스 변수, 클래스 변수, 인스턴스 메서드, 클래스 메서드 본문
class Person():
people_cnt = 0
def __init(self,name):
self.name = name
Person.people_cnt += 1
@classmethod
def get_cnt(cls):
print(cls.people_cnt)
def get_cnt2()
print(Person.people_cnt)
def get_name(self):
print(self.name)
kim = Person('kim')
lee = Person('Lee')
이러한 클래스가 있다고 가정해보자 기본적으로 people_cnt라는 클래스 변수를 0으로 지정해두었다. 그리고 객체가 생성될 때 인스턴스 메소드 __init__이 실행이된다. self.name(인스턴스 변수)에 name이들어가고 Person.people_nct(클래스 변수)에는 기존 값에 +1 이 되어진다. 여기서 인스턴스 변수에 접글할때는 self를 붙이고 클래스 변수에 접근할 때는 Person(클래스 명)을 붙여주어야 한다.
클래스 변수를 사용하는 이유는 클래스에서 공통적으로 사용될 수 있는 요소가 필요하기 때문이다.
위의 예에서는 생성된 클래스 요소가 몇개인지 전체 개수를 세기 위해서 존재한다.
kim.get_name()
이 인스턴스 메서드가 실행이 된다고 가정해보자. 그럼 파이썬 인터프리터는 이걸 아래와 같이 바꿔 해석한다.
Person.get_name(kim)
따라서 실제로 아래의 함수는
def get_name(self):
print(self.name)
self에 kim객체가 들어오고 그 kim이 가지고 있는 개별적인 인스턴스 변수 name에 접근하여 name이 출력이 되는 것이다.
근데 클래스 변수에 접근 할 때는 굳이 self를 받아오지 않아도 된다. (self를 통해 접근하는 것이 아니기 때문)
def get_cnt2()
print(Person.people_cnt)
이 경우에 kim.get_cnt2()를 실행하면 어떻게 될까???
방금 인터프리터에서 Person.get_cnt2(kim) 이렇게 해석한다고 했다. 그런데 우리는 매개변수에 self를 주지 않았다. 따라서 매개변수가 없는데 인자가 있으니 에러가 발생한다. 이 경우에 클래스객체에서 직접 호출하면 즉, Person.get_cnt2()를 하면 오류없이 잘 출력이 가능하다.
물론 self를 넣어주면 kim.get_cnt2()가 실행이 잘 될 것이다.
반대로 이 경우에는 Person.get_cnt2()에는 오류가 날 것이다. 매개변수가 존재하는데 인자가 없으니..
이러한 로직으로 흘러가는 걸 이해했다. 하지만 우리가 메소드를 호출할 때 클래스 이름으로 호출하지는 않는다
Person.get_cnt2()이것 보다는 kim.get_cnt2()이렇게 호출하는 것이 더 자연스럽다.그럼 이 경우에는 어떻게 해주어야 자연스러울까?? (클래스 변수에 접근할 때)
바로 클래스 메소드를 사용해주면 된다.
@classmethod
def get_cnt(cls):
print(cls.people_cnt)
이렇게 해주면 된다. @classmethod를 붙여주면 자동으로 매개변수cls안에 Person클래스가 들어간다.
매개변수 이름은 cls라고 관례적으로 적어준다. cls.people_cnt로 접근하면 클래스 변수에 잘 접근할 수 있다.
이렇게 해줄 경우에
kim.get_cnt()로 해줘도 오류가 나지 않고 Person.get_cnt()로 해줘도 오류가 안난다.
@classmethod의 힘이다.
'Python > 이것 저것' 카테고리의 다른 글
if __name__ == __main__ 을 알아보자 !! (0) | 2022.01.03 |
---|---|
Flask redirect , uri_for를 알아보자! (0) | 2021.12.28 |
datetime 파이썬에서 날짜와 시간 다루기 (0) | 2021.12.25 |
파이썬 문제 풀이 (0) | 2021.12.19 |
몰랐던 것들 (문자열 인덱싱, 슬라이싱, endswith, startswith,del ,remove, sum, min, max, join, dict ) (0) | 2021.12.15 |