[파이썬] 클래스, self, __init__, __str__
목차
클래스
데이터의 처리, 정의 등을 하나로 정리해 둔 모형과 같음.
붕어빵 틀과 같다.
효과
모든 변수를 어떠한 범위에 소속시킴.
재사용 간편함.
코드 수정 최소화.
함수 실행중에 함수 자신을 다시 호출하는 일이 가능.
사용법
클래스에 정의된 데이터와 메서드를 사용하기 위해서는 인스턴스를 생성하여 클래스를 실체화해야 한다.
객체란 붕어빵 틀에 반죽을 넣어서 만들어진 붕어빵과 같다.
(이때 메서드란, 클래스 내에 기재된 함수를 의미한다.)
각 객체는 하나의 클래스에 의해 독립적으로 존재할 수 있으므로, 하나의 클래스에 대한 여러 가지 인스턴스들이 각각 다른 데이터를 가지도록 할 수도 있다.
class Status():
def __init__(self, name, level, weapon):
self.name = name
self.level = level
self.weapon = weapon
def __str__(self):
return f"name : {self.name}, level : {self.level}, weapon : {self.weapon}"
stat = Status("Minsu", 1, "gun")
stat2 = Status("Messi", 2, "sword")
print(stat)
print(stat2)
name : Minsu, level : 1, weapon : gun
name : Messi, level : 2, weapon : sword
stat = Status("Minsu", 1, "gun")
Status 클래스의 데이터를 stat으로 할당한다.
이는 stat이 Status 클래스의 객체로서 생성된 것이며, 클래스 외부에서도 stat을 통해 Status 클래스의 데이터와 메서드를 사용할 수 있게 된다.
stat2 = Status("Messi", 2, "sword")
stat2는 stat1과 독립된 객체이므로, stat1과 다른 데이터를 보유할 수 있게 된다.
https://afterdawncoding.tistory.com/80
self
__init__메서드는 네 개의 매개변수를 받는데, name, level, weapon은 사용자로부터 받은 데이터를 메서드로 전달할 때 사용하는 매개변수이다.
다음과 같은 코드에서 func1()를 호출하면 에러가 발생한다.
class Foo:
def func1(): # 매개변수 없음
print("function 1")
def func2(self):
print("function 2")
f = Foo() # 인수 없음
f.func1()
이는 func1()은 매개변수가 없지만 하나를 받았다는 의미이다.
실제로 클래스 외부에서 func1에는 아무런 인수를 주지 않았지만, 파이썬 자체적으로는 func1() 메서드의 첫 번째 매개변수로 객체가 전달되기 때문에 이런 에러가 발생한다.
그러나 func2()를 호출하는 경우에는 문제없이 잘 출력된다.
class Foo:
def func1():
print("function 1")
def func2(self): # 매개변수 있음
print("function 2")
f = Foo()
f.func2() # 인수 없음
function 2
클래스 내부에 있는 func2 메서드에 self라는 매개변수가 있음에도 불구하고, 클래스 외부에서 이를 호출했을 때 매개변수로 아무 값을 주지 않았지만 정상적으로 function 2가 출력되었음을 알 수 있다.
이는 func1()을 호출할 때와 같은 이유로 첫 번째 매개변수 self에 대한 값에 대해서 파이썬이 자체적으로 인스턴스를 전달하기 때문이다.
따라서 클래스 내에 있는 메서드에 접근하기 위해서는 매개변수에 self값을 넣어주어야 한다. self값을 통해 인스턴스를 전달받을 수 있기 때문이다.
결국 self는 인스턴스 자기 자신을 참조하는 매개변수이다. 파이썬은 클래스의 메서드를 정의할 때 self를 명시하도록 하고, self를 통해 클래스 내에 정의한 멤버에 접근할 수 있게 된다.
__init__
클래스 생성 시 자동으로 실행(호출)되는 메서드
위와 같은 이유로 반드시 첫 번째 매개변수로 self를 지정해야 한다. self를 통해 인스턴스 값을 전달받으므로, 인스턴스 변수를 작성하거나 참고하는 일이 가능해진다.
__str__
클래스 자체의 내용을 출력할 때 __init__에서 규정한 형식을 지정하는 메서드
인스턴스를 문자열로 표현한 것을 반환해주는 용도로 사용된다.
class Status():
def __init__(self, name, level, weapon):
self.name = name
self.level = level
self.weapon = weapon
def __str__(self):
return f"name : {self.name}, level : {self.level}, weapon : {self.weapon}"
stat = Status("Minsu", 1, "gun")
stat2 = Status("Messi", 2, "sword")
print(stat)
print(stat2)
name : Minsu, level : 1, weapon : gun
name : Messi, level : 2, weapon : sword
'파이썬 > 자료구조와 알고리즘' 카테고리의 다른 글
[python] 백준 11557 : Yangjojang of The Year (0) | 2022.04.25 |
---|---|
[파이썬] 유클리드 호제법을 이용한 최대공약수, 최소공배수 구하기 (0) | 2022.03.05 |
[파이썬/자료구조] 스택(stack) (0) | 2022.02.22 |
[파이썬/자료구조] 큐(queue) 덱(deque) (0) | 2022.02.20 |
파이썬 자료구조/알고리즘 10 : 소수 찾기 알고리즘 (0) | 2022.02.10 |