class AAA: # 클래스
BBB = ‘Hello’ # 속성
AAA.BBB → 'Hello'출력 # 클래스의 속성에 접근
class AAA:
BBB = ‘Hello’
def print_hello(): 클래스 내에서 작동하게 되는 함수 → 메서드(method)
print(‘Hello World”)
AAA.print_hello() → 'Hello'출력
class AAA:
BBB = ‘Hello’
def print_hello(self): self를 넣어줘야함
print(‘Hello World”)
클래스를 활용해 인스턴스를 생성하고 print_hello 메서드를 부르기
i_AAA = AAA()
i_AAA.print_hello() → 'Hello'
함수를 호출할 때 아무런 인수를 넘기지 않고 그저 함수를 실행했고
다만 메소드 내에서 파라미터를 self 하나 받도록 설정했다
이렇게 할 수 있는 이유는 파이썬에서 인스턴스가 메서드나 특성을 사용할 때 자동으로 그 인스턴스에 대한 참조값을 넘기지만 자동으로 받도록 하지는 않기 때문이다
따라서 함수를 실행하게 될 때는 poke_a 인스턴스에 대한 참조값이 자동으로 넘겨지지만 실제로 함수를 실행할 때 파라미터 설정이 되어 있지 않게 되는 경우에는 필수 인수가 0이라 불일치한 현상이 발생하는 것이죠
생성자 함수는 클래스가 인스턴스화 (instantiate) 될 때 사용되는 함수
새로운 인스턴스를 생성하게 될 때 생성자 함수가 따로 정의되어 있지 않은 경우에는 파이썬의 기본 생성자 함수를 사용하게 되어 있습니다.
class AAA:
def __init__(self, BBB='Hello'):
self.BBB = BBB
i_AAA = AAA()
print(i_AAA.BBB) → 'Hello'
위 코드처럼 클래스를 기반으로 생성되는 인스턴스는 클래스의 생성자 함수에 따라 인스턴스의 초기 속성들을 받을 수 있다. 하지만 이는 인스턴스마다의 속성이지 클래스 전체에 대한 속성은 아니어서 클래스 자체에서는 이러한 속성들에 대한 접근이 안된다.
예를 들어 다음과 같은 코드에서 Pokemon 클래스는 인스턴스의 속성에 접근 할 수 없다
print(AAA.BBB) → AttributeError: type object 'AAA' has no attribute 'BBB'
파이썬에서 사전에 정의가 되어 있는 메소드들이 존재
파이썬에서는 클래스를 만들고 해당 클래스 특성들을 설정해 줄 수 있다
이렇게 클래스 특성들을 생성할 때 self 를 통해서 생성해 줄 수도 있지만 여러 변수가 연결되거나 특별히 관리가 필요한 경우 등 이러한 상황들에서는 따로 함수로 작동하는 방식으로 관리해 줄 수 있다
class Person:
def __init__(self, first_name, last_name):
self.first_name = first_name
self.last_name = last_name
self.full_name = self.first_name + ' ' + self.last_name
name = Person('Lee', 'SS')
print(name.first_name) → 'Lee'
print(name.last_name) → 'SS'
print(name.full_name) → 'Lee SS'
만약에 여기에서 first_name 을 Kim 로 변경하면
name.first_name = 'Kim'
# 생성자 함수가 실행될 때에 값이 정해지고 바꿔지지 않는다
print(name.first_name) → 'Kim'
print(name.full_name) → 'Lee SS' # 변경 X
변경하려면
class Person:
def __init__(self, first_name, last_name):
self.first_name = first_name
self.last_name = last_name
def full_name(self):
return self.first_name + ' ' + self.last_name
name.first_name = 'Kim'
print(name.first_name) → 'Kim'
print(name.full_name) → 'Kim SS' # 변경 O
※ @property 사용
해당 메소드를 클래스의 특성 (attribute) 처럼 접근할 수 있다
class Person:
def __init__(self, first_name, last_name):
self.first_name = first_name
self.last_name = last_name
@property
def full_name(self):
return self.first_name + ' ' + self.last_name
name = Person('Lee', 'SS')
name.first_name = 'Kim'
print(name.first_name) → 'Kim'
print(name.full_name) → 'Kim SS'
이런 식으로 클래스 내에 다른 특성들과 연관이 되어 있는 특성들을 관리할 때 사용을 할 수 있다
full_name 을 설정하게 되면 first_name 을 바꿔주는 방법
class Person:
def __init__(self, first_name, last_name):
self.first_name = first_name
self.last_name = last_name
@property ← 메소드 위에 @property를 쓰면 그 메소드가 getter 메소드가 된다
def full_name(self):
return self.first_name + ' ' + self.last_name
@full_name.setter
def full_name(self, new_full_name):
first_name, last_name = new_full_name.split()
self.first_name = first_name
self.last_name = last_name
name = Person('Lee', 'SS')
print(name.first_name) → 'Lee'
print(name.full_name) → 'Lee SS'
name.full_name = 'Kim WW' # 풀네임 변경
print(name.first_name) → 'Kim'
print(name.last_name) → 'WW'
print(name.full_name) → 'Kim WW'
변수나 함수에 특별한 의미를 부여할 때 사용
생성자 함수(init)는 클래스를 통해서 인스턴스를 생성하게 해주는 특별한 용도의 함수이기 때문에 앞뒤로 두 개의 밑줄을 붙여준다
파이썬에서는 이를 'double underscore' 혹은 'dunderscore' 라고한다
class AAA:
_CCC = 100
def __init__(self, BBB='some'):
self.BBB = BBB
i_AAA = AAA()
print(i_AAA._CCC) → 100
※ 다만 이렇게 클래스 내부 변수나 값으로 사용하더라도 파이썬에서는 외부에서 접근할 수가 있다
(_는 아무기능이 없는 대신 개발자들에게 경고표시다)
class AAA:
__CCC = 100
def __init__(self, BBB='some'):
self.BBB = BBB
i_AAA = AAA()
print(i_AAA.__CCC) → Error
※ 밑줄을 두 개 사용하게 된다면 정해준 이름을 사용하지 않고
_<클래스 이름>_<변수 혹은 함수 이름> 으로 변경된다
즉, 위에서는 __CCC 가 _AAA__CCC 로 변경
밑줄을 두 개 사용한다고 해서 클래스 내부에서만 접근 가능한 private 개념이 되는 것이 아닌 여전히 public 개념
print(i_AAA._AAA__CCC) → 100
파이썬에서는 온전한 private 한 개념이 없다
따라서 이러한 방법들을 통해서 파이썬 클래스 내부 값들을 외부에서 접근하기 힘들게 할 수는 있지만 접근이 불가하지는 않다