파이썬에서 클래스를 정의하는 방법은 다음과 같다.
class User:
pass #속성이나 행동 정의 없이 빈 클래스임
user1 = User()
user2 = User()
여기서 user1, user2는 각각이 인스턴스, 객체가 된다. 이들은 모두 User Class로 만들어졌지만 서로 다른 존재라는 특징이 있다.
메소드에는 3가지 종류 - 인스턴스 메소드, 클래스 메소드, 정적 메소드 - 가 있는데, 이 중 인스턴스 메소드는 인스턴스의 변수을 사용하거나 인스턴스 변수를 바꾸는 역할이 포함된 메소드이다.
class User:
def say_hello(some_user):
print("안녕하세요 저는 {}입니다!".format(some_user.name))
user1 = User()
user1.name = '김철수'
User.say_hello(user1)
실행결과
안녕하세요 저는 김철수입니다!
또한 인스턴스 메소드에는 특별한 규칙이 있는데, 바로 클래스.메소드 로 호출하지 않고 인스턴스.메소드로 호출했을 때 첫 번째 파라미터는 자동으로 인스턴스가 된다는 것이다.
class User:
def say_hello(some_user):
print("안녕하세요 저는 {}입니다!".format(some_user.name))
user1 = User()
user1.name = '김철수'
user1.say_hello()
이 코드가 위의 코드와 완전히 동일한 기능을 한다는 뜻이다.
그래서 python 에서는 첫 번째 파라미터의 이름을 항상 self로 저장하는 것을 권장한다.
__init__
특수 메소드는 특정 상황에서 자동으로 호출되는 메소드를 의미한다. init 메소드도 그 중 하나인데, init의 경우에는 '인스턴스가 생성될 때' 자동으로 호출된다. 그러면 처음 인스턴스를 생성할 때 괄호 안에 파라미터를 init 메소드의 파라미터에 넣을 것으로 상정하고 넣으면 된다.
클래스 변수는 한 클래스로부터 생성된 모든 인스턴스들이 공유하는 변수라고 보면 된다.
class User:
count = 0
def __init__(self, name, email, password):
self.name = name
self.email = email
self.password = password
count += 1
user1 = User("김철수", "Cheolsoo@codeit.kr", "1234")
user2 = User("홍길동", "Gildong@codeit.kr", "2345")
print(count)
실행결과는 2다.
한 가지 주의해야 할 점으로, 같은 이름의 클래스 변수와 인스턴스 변수가 있다면 호출할 때 인스턴스 변수가 우선된다.
def print_hello():
print("hello!")
def add_startend(original):
def wrapper():
print("it starts!")
original()
print("it ends!")
return wrapper
add_startend(print_hello)()
위의 코드는 print_hello 함수를 꾸며주는 add_startend함수를 이용한 코드이다. 이렇게 이미 주어진 함수를 활용해서 새로운 함수를 만들어주는 함수를 데코레이터 함수라고 한다.