5. 파이썬 심화 - 클래스 활용
클래스 활용
1. 클래스의 속성
클래스 속성은 클래스에 속해 있다.
그렇기 때문에 클래스의 속성은 모든 인스턴스에서 공유된다.
클래스의 속성 기본 구조
어렵게 생각할 것 없이 클래스에 바로 속성을 만들면 된다.
class 클래스 이름 :
속성 = 값
# 주의) __init__ => 인스턴스 속성 !
인스턴스 속성 같은 경우는 클래스의 속성과 다르게 인스턴스 별로 독립되어 있고 그렇기 때문에 서로 영향을 주지 않는다.
그럼 확인 해보자!
클래스의 속성일 때
class Person :
bag = []
def putBag(self, stuff):
self.bag.append(stuff)
# Person.bag.append(stuff) # 클래스로 클래스 속성에 접근
Jerry = Person()
Jerry.putBag('Books')
# Person.putBag('pen')
Joy = Person()
Joy.putBag('Wallet')
print(Jerry.bag) # 제리의 가방
print(Joy.bag) # 조이의 가방
# outPut
# >>> ['Books', 'Wallet']
# >>> ['Books', 'Wallet']
인스턴스가 존재할 때
class Person :
# bag = []
def __init__(self):
self.bag = [] # 인스턴스 속성
def putBag(self, stuff):
self.bag.append(stuff)
Jerry = Person()
Jerry.putBag('Books')
Joy = Person()
Joy.putBag('Wallet')
print(Jerry.bag) # 제리의 가방
print(Joy.bag) # 조이의 가방
# outPut
# >>> ['Books']
# >>> ['Wallet']
정리하자면
클래스 속성은
- 모든 인스턴스가 공유
- 인스턴스 전체가 사용해야 하는 값을 저장할 때 사용
인스턴스 속성은
- 인스턴스별로 독립되어 있음
- 각 인스턴스가 값을 따로 저장해야 할 때 사용
2. 비공개 클래스 속성
비공개 속성은 __속성
비공개 클래스의 속성 기본 구조
어렵게 생각할 것 없이 비공개 클래스에 바로 속성을 만들면 된다.
class 클래스 이름 :
__속성 = 값 # 비공개 클래스의 속성 -> 외부에서 접근 x
만약 클래스에서 공개하고 싶지 않은 특정 속성이 있다면 비공개 클래스를 사용하는 것이 좋다.
class creditCard:
"""
1만불 한도의 신용카드
"""
__money_limit = 10000 # 비공개 클래스 속성
def show_money_limit(self):
print(creditCard.__money_limit) # 내부 접근
amax = creditCard()
amax.show_money_limit() # 1만불
print(creditCard.__money_limit) # 외부 접근 불가
# outPut
# >>> 10000
# >>> Traceback (most recent call last):
# File "c:/KISS/Python/TestDummy.py", line 19, in <module>
# print(creditCard.__money_limit) # 외부 접근 불가
# AttributeError: type object 'creditCard' has no attribute '__money_limit'
3. 정적 메서드 **
정적 메서드는 인스턴스를 통하지 않고 클래스에서 바로 호출이 가능하다.
메소드 위에 @staticmethod
를 붙이면 정적 메서드로 사용 가능하다.
그리고 @staticmethod
을 붙인 정적 메서드는 매개변수에 self를 지정하지 않다.
@
은 메서드(함수)에 추가 기능을 구현할때 쓰는 데코레이터이다.
정적 메소드 기본 구조
class 클래스이름:
@staticmethod
def 메소드(매개변수1, 매개변수2):
코드
심플하게 정적 메서드를 활용해 보자!
class Mall:
"""
wMart와 eMart 중 어디가 더 저렴할까 ?
"""
@staticmethod
def wMart(a, b):
print(f'$ {int((a + b)*0.8)}')
@staticmethod
def eMart(a, b):
print(f'$ {a + b}')
apple = 10
soup = 20
Mall.wMart(apple, soup)
Mall.eMart(apple, soup) # 클래스 -> 바로 메소드 호출
# outPut
# >>> $ 24
# >>> $ 30
정적 메서드는 인스턴스 속성에는 접근할 수 없다.
그래서 인스턴스(속성, 메서드)가 필요없을 경우 사용하는데 인스턴스의 상태를 변화시키지 않는 메소드
즉, 메서드의 실행이 외부 상태에 영향을 끼치지 않는 순수 함수(Pure function)를 만들 때 사용한다.
4. 클래스 메소드 **
정적 메서드와 유사하지만 다른 메서드에 대해 알아보자!
클래스 메서드 = @classmethod
정적 메서드처럼 메소드 위에 @classmethod
을 붙인다.
클래스 메서드 기본 구조
class 클래스이름:
@classmethod
def 메소드(cls, 매개변수1, 매개변수2):
코드
클래스 메소드 출력
클래스 메서드는 메소드 안에서 클래스 속성, 클래스 메서드에 접근할 때 사용하며
정적 메서드처럼 인스턴스 없이 호출할 수 있다.
cls()
= Person()
class Person:
cnt = 0
def __init__(self):
Person.cnt += 1 # 명확하게 클래스 속성에 접근을 확인하기 위함
@classmethod
def printCnt(cls):
print(f'생성 : {cls.cnt}') # cls로 클래스 속성에 접근
Jerry = Person()
Joy = Person()
Person.printCnt()
#outPut
# >>> 생성 : 2
Reference
- 파이썬 코딩도장 : https://dojang.io/
Practice makes perfect!
'Programming > Python' 카테고리의 다른 글
[ Python_심화 ] 7. 추상 클래스 (0) | 2020.07.02 |
---|---|
[ Python_심화 ] 6. 클래스 상속(inheritance) (0) | 2020.07.01 |
[ Python_심화 ] 4. 클래스_02 (0) | 2020.06.27 |
[ Python_심화 ] 4. 클래스_01 (2) | 2020.06.26 |
[ Python_심화 ] 3. 클로저(Closure) (0) | 2020.06.25 |