class Person:
def __init__(self.name):
self.name=name
def eat(self, food):
print(f'{food} 냠냠')
person1=Person('홍길동')
person1.eat('피자') # 피자 냠냠
메서드 종류
인스턴스 메서드
호출한 인스턴스를 의미하는 self
매개 변수를 통해 인스턴스를 조작
인스턴스 메서드는 클래스 변수, 인스턴스 변수 둘 다 사용 가능
class MyClass:
def instance_method(self):
return 'instance method', self
my_instance = MyClass()
print(my_instance.instance_method())
# ('instance method', <__main__.MyClass at 0x184fd086a00>)
self
__init__
(생성자 메서드)
__del__
(소멸자 메서드; destructor)
매직 메서드( __ )
__str__(self)
: 해당 객체의 출력 형태를 지정__str__
의 return값이 출력__str__
vs __repr__
__gt__
: 부등호 연산자 (>, greater than)__len(self)__
, __repr__(self)
등# 매직 메서드 예시
class Circle:
def __init__(self, r):
self.r = r
def area(self):
return 3.14 * self.r * self.r
def __str__(self): # 출력
return f'[원] radius: {self.r}'
def __gt__(self, other): # 부등호
return self.r > other.r
c1 = Circle(10)
c2 = Circle(1)
print(c1) # __str__ 실행 => [원] radius : 10
print(c2) # __str__ 실행 => [원] radius : 1
print(c1 > c2) # __gt__ 실행 => True
print(c1 < c2) # __gt__ 실행 => False
클래스 메서드
클래스가 사용할 메서드
@classmethod 데코레이터를 사용하여 정의
클래스를 의미하는 cls
매개 변수를 통해 클래스를 조작
클래스 메서드는 인스턴스 변수 사용 불가
class MyClass:
@classmethod # 클래스 메서드라고 선언해줘야함
def class_method(cls):
return 'class method', cls
MyClass.class_method()
# 클래스 메서드 활용
class Person:
count = 0
def __init__(self, name):
self.name = name
Person.count += 1
@classmethod
def number_of_population(cls):
print(f'인구수는 {cls.count}명 입니다.')
person1 = Person('아이유')
person2 = Person('이찬혁')
Person.**number_of_population()** # 인구수는 2명 입니다.
데코레이터
함수를 어떤 함수로 꾸며서 새로운 기능을 부여
@데코레이터(함수명) 형태로 함수 위에 작성
순서대로 적용되기 때문에 작성 순서가 중요
# 데코레이터 X
def hello():
print("hello")
def add_print(original): # 파라미터로 함수를 받는다
def wrapper(): # 함수 내에서 새로운 함수 선언
print("함수 시작") # 부가기능 -> original 함수를 꾸밈
original()
print("함수 끝") # 부가기능 -> original 함수를 꾸밈
return wrapper # 함수를 return # 뒤에 ()가 붙지 않음!!
# 이 개념을 이해하기 위해서는 '클로저' 학습 필요
add_print(hello)() # 함수 시작
# "hello"
# 함수 끝
#아래와 같이도 호출 가능
print_hello = add_print(hello)
print_hello()
# 데코레이터 O
def add_print(original): # 파라미터로 함수를 받는다
def wrapper(): # 함수 내에서 새로운 함수 선언
print("함수 시작") # 부가기능 -> original 함수를 꾸밈
original()
print("함수 끝") # 부가기능 -> original 함수를 꾸밈
return wrapper # 함수를 return # 뒤에 ()가 붙지 않음
# 클로저 개념으로, 함수를 실행하지 않고 오브젝트만 반환
@add_print # add_print를 사용해서 print_hello()함수를 꾸며주도록 하는 명령어
def print_hello():
print('hello')
print_hello()
정적 메서드(Static Method)
인스턴스 변수, 클래스 변수를 전혀 다루지 않는 메서드
self
, cls
가 필요없음
속성을 다루지 않고 단지 기능(행동)만을 하는 메서드를 정의할 때 사용
즉, 객체 상태나 클래스 상태를 수정할 수 없음
@staticmethod 데코레이터를 사용하여 정의
일반 함수처럼 동작하지만, 클래스의 이름 공간에 귀속됨.
- 주로 해당 클래스로 한정하는 용도로 사용
class MyClass:
@staticmethod
def static_method(arg1, ...):
MyClass.static_method(...)
# 스태틱 메서드 사용 예시
class Person:
count = 0
def __init__(self, name):
self.name = name
Person.count += 1
@staticmethod
def check_rich(money):
return money > 10000
person1 = Person('아이유')
person2 = Person('이찬혁')
# 스태틱 메서드는 클래스 메서드와 인스턴스 메서드로도 접근 가능
print(Person.check_rich(100000)) # True => 클래스 메서드에서 접근
print(person1.check_rich(100000)) # True => 인스턴스 메서드에서 접근
인스턴스와 클래스 간의 이름 공간(namespace)
클래스를 정의하면, 클래스와 해당하는 이름 공간 생성
인스턴스를 만들면, 인스턴스 객체가 생성되고 이름 공간 생성
인스턴스에서 특정 속성에 접근하면, 인스턴스-클래스 순으로 탐색
# Person 정의
class Person:
name= 'Unknown'
def talk(self):
print(self.name)
p1 = Person()
# p1은 인스턴스 변수가 정의되지 않아 클래스 변수(Unknown)가 출력됨.
p1.talk() # Unknown
p2 = Person()
p2.talk() # Unknown
# p2에 인스턴스 변수를 정의하면 출력됨.
p2.name = '홍길동'
p2.talk() # 홍길동
print(Person.name)
print(p1.name) # unknown <= 클래스 변수
print(p2.name) # 홍길동 <= 인스턴스 변수