self는 객체의 인스턴스 그 자체를 말하며 객체 자기 자신을 참조하는 매개변수이다. 즉, self가 없는 클래스 메서드는 인스턴스를 받을 수 없기 때문에 인스턴스로부터 접근하려하면 에러가 발생한다.
Python에서 메서드를 사용할 때 보통 인스턴스로 만든 후 사용하는게 일반적이기 때문에 메서드를 정의할 때 self를 첫 번째 인자값으로 주는 것이 좋다.
class Myclass:
def no_self():
print("self 없음")
def yes_self(self):
print("self 있음")
c = Myclass() # 인스턴스 생성
c.yes_self() # self 있음 / 클래스 Myclass의 yes_self 메서드는 실제 메서드를 호출할 때 첫 번째 인자인 self에 대한 값을 파이썬이 자동으로 넘겨주기 때문에 아무것도 전달해주지 않아도 된다.
c.no_self() # TypeError: Myclass.no_self() takes 0 positional arguments but 1 was given
# 인스턴스 no_self()는 인자값을 받지 않는 메서드인데 한 개의 인자를 받았다고 한다.
# Python 에서는 첫 번째 인자로 항상 인스턴스가 전달되기 때문이다.
# 클래스 Myclass의 no_self메소드에 self인자가 없어서 인스턴스로부터의 접근을 받을 수가 없다.
# self가 없는 클래스의 메서드를 호출하려면 'Myclass.no_self() (클래스.메소드)'의 형식으로 접근해야한다.
class Myclass:
def no_self(self,msg):
print(msg)
def yes_self(self):
print("그냥 되지롱")
c = Myclass()
c.no_self("이젠 되지롱") # 이젠 되지롱
c.yes_self() # 그냥 되지롱
__init__
(initiate)생성자('init'메서드) : 클래스로부터 인스턴스(객체)를 생성할 때 자동으로 호출되며, 객체가 생성될 때 해당 객체의 초기 상태를 설정한다.
메서드 : 클래스 안에서 정의해주는 함수
class Person:
def __init__(self, name, age):
self.name = name # 인스턴스 변수 초기화
self.age = age
person1 = Person("Alice", 30) # 객체 생성과 함께 초기화
person2 = Person("Bob", 25)
print(person1.name, person1.age) # 객체의 속성에 접근
print(person2.name, person2.age)
self.name = name
과 self.age = age
가 self.name = "Alice"
와 self.age = 30
으로 초기화 된 값이 들어간다.class의 속성들을 init함수를 통해서 정의해주면 된다.
class Person:
def __init__(self, name, age, height):
self.name = name
self.age = age
self.height = height
person1 = Person("Alex", 27, 174)
# '__init__`이라고 메서드를 명시하지 않았지만 클래스가 실체화될 때 자동으로 `__init___`메소드가 호출된다.
# class Person의 인자는 self, name, age, height 4개인데 호출된 부분을 보면 name, age, height만 호출되었다.
# 여기서 self는 class의 실체(instance)인 객체(Object)를 가리킨다.
클래스가 실체화 할 때 객체(self)를 자동으로 __init__
함수에 넘겨준다.
__init__
메소드의 self는 맨 처음으로 정의되어있어야 자동으로 넘겨줄 수 있다.__init__
메소드의 self는 클래스가 실체화 된 객체를 파이썬이 자동으로 넘겨준다.__init__
메소드는 클래스가 실체화 할 때 자동으로 호출된다.Parameter(매개변수)로 넘겨진 name, age, height 값을 self에 동일하게 저장하는 이유는 다른 메소드에서도 사용하기 위해서이다.
class Person:
def __init__(self, name, age, height):
self.name = name
self.age = age
self.height = height
def get_age(self):
return f"{self.name}가 {self.age}살에서 한 살 더 먹었다!"
person1 = Person("Alex", 27, 174)
person1.get_age() # Alex가 27살에서 한 살 더 먹었다!
만약, person1 객체를 생성할 때 클래스에 생성자 __init__
메소드가 없었다면 person1 = Person()으로 매개변수 값 없이 넣어줘도 생성이 될 것이다. 하지만 생성자 __init__
메소드가 있을 때 매개변수 값을 넣어주지 않는다면 오류가 난다. 생성자 __init__
메소드가 객체를 생성하는 순간 자동호출이 되는데 생성자의 매개변수 값들이 전달되지 않았기 때문이다.
#class에 __init__메소드를 사용할 경우 인스턴스 생성 시 해당 메소드가 실행된다.
class CookieFrame():
def __init__(self, name):
print(f"생성 된 과자의 이름은 {name} 입니다!")
self.name = name
cookie1 = CookieFrame("Mint")
cookie2 = CookieFrame("Lemon")
cookie3 = CookieFrame()
print(cookie1.name) # 생성 된 과자의 이름은 Mint 입니다!
print(cookie2.name) # 생성 된 과자의 이름은 Lemon 입니다!
print(cookie3.name) # TypeError: __init__() missing 1 required positional argument: 'name' / init 함수에서 name이라는 인자로 받고 있는데 입력된 인자가 없어서 에러가 발생
#인자가 입력되지 않았을 경우에도 함수가 실행되길 원하면 init함수의 name인자에 고정 값을 지정해주면 된다.
class CookieFrame():
def __init__(self, name="defalutname"):
print(f"생성 된 과자의 이름은 {name} 입니다!")
self.name = name
cookie3 = CookieFrame()
print(cookie3.name) # 생성 된 과자의 이름은 defalutname 입니다!
# 모든 종류의 함수에서 활용 가능하다.