Class self, __init__ 메서드

장현웅·2023년 8월 27일
0

1. self


  • self는 객체의 인스턴스 그 자체를 말하며 객체 자기 자신을 참조하는 매개변수이다. 즉, self가 없는 클래스 메서드는 인스턴스를 받을 수 없기 때문에 인스턴스로부터 접근하려하면 에러가 발생한다.

  • Python에서 메서드를 사용할 때 보통 인스턴스로 만든 후 사용하는게 일반적이기 때문에 메서드를 정의할 때 self를 첫 번째 인자값으로 주는 것이 좋다.

클래스 내부에 정의된 함수인 메서드의 첫 번째 인자는 반드시 self여야 한다? No

  • 첫 번째 인자가 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()					# 그냥 되지롱

2. __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)
    • 인스턴스(객체) person1과 person2가 생성될 때 class에 self.name = nameself.age = ageself.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 입니다!
                           # 모든 종류의 함수에서 활용 가능하다.

0개의 댓글