오늘의 Python - init & self

Soonyoung Kim·2022년 4월 26일
0

🆓오늘의 Python

목록 보기
3/3
post-thumbnail

self

  • self란 클래스의 인스턴스를 나타내는 변수

  • class 내 method 들의 첫번째 인자로 전달됩니다.

    • 다른 언어들은 이 과정을 프로그래머 모르게 알아서 처리하기도 하지만 파이썬은 이를 명시적으로 프로그래머가 해줘야 합니다.
class Person:
    def sayHello():
        print('hi')

man = Person()
man.sayHello()

# TypeError: Person.sayHello() takes 0 positional arguments but 1 was given
# 에러의 뜻은 sayHello 메소드에 argument를 전달했는데 받는 처리를 안해서 문제
class Person:
    def sayHello(self):
        print('hi')

man = Person()
man.sayHello()

# hi
# self를 sayHello 메소드에 넣으면 정상 수행
  • 클래스의 메소드들은 self를 첫번째 인자로 받도록 해주어야 합니다.
  • man.sayHello() 호출 시 파이썬이 자동으로 sayHello 메소드에 self를 전달하기 때문입니다.

  • self는 어디에 위치해 있을까요?
  • 객체의 메모리 주소를 알아내는 id()함수를 사용해 어디에 있는지 알 수 있습니다.
class Person:
    def sayHello(self):
        print(id(self)) # 2757106068848
        print('hi') # hi

man = Person()
man.sayHello()
class Person:
    def sayHello(self):
        print(id(self))
        print('hi')

man = Person()
man.sayHello()
print(id(man))

# 1383514172784
# hi
# 1383514172784
  • 인스턴스 man의 주소와 self의 주소가 같습니다.
  • man과 self는 사실 같은 것입니다.

  • man이라는 인스턴스가 없이 클래스의 함수가 호출 될 때는 어떨까요?
  • 클래스는 인스턴스를 만들지 않아도 (man = Person()을 통해 man 변수에 Person 객체를 담지 않아도) 네임스페이스를 따로 갖고 있기 때문에 Person.sayHello()처럼 호출할 수 있습니다.
class Person:
    def sayHello(self):
        print(id(self))
        print('hi')

Person.sayHello()

# TypeError: Person.sayHello() missing 1 required positional argument: 'self'
  • 호출은 되지만 self를 전달하지 않아서 에러가 발생합니다.
  • 무엇을 전달해야하는가? self는 인스턴스라고 했기 때문에 인스턴스를 전달하면 됩니다.
  • 인스턴스를 하나 만들어서 Person.sayHello() 에 전달하겠습니다.
class Person:
    def sayHello(self):
        print(id(self))
        print('hi')

man = Person()
Person.sayHello(man)
print(id(man))

#2363631005040
#hi
#2363631005040
  • Person.sayHello() 통해 sayHello 매소드가 호출되기는 하나 인스턴스를 통해 호출한 것이 아니라 클래스를 통한 호출이라 Person.sayHello()는 인스턴스를 통한 호출 man.sayHello()과는 조금 다릅니다.

  • Person.sayHello() 역시 메소드를 정상적으로 호출할 수 있는 것은 마찬가지이기 때문에 인자로 인스턴스를 잘 전달하면 문제없이 수행됩니다.

  • 전달되는 인스턴스는 꼭 Person 객체를 통해 만든 인스턴스가 아니어도 됩니다.

class Person:
    def sayHello(self):
        print(id(self))
        print('hi')

class Robot:
    life = 1000

bot = Robot()
man = Person()
Person.sayHello(bot)
print(id(man))

#2866641665088
#hi
#2866643139408

init

  • 클래스에서 self는 자기자신
  • Student : 클래스(붕어빵틀)
    • 이름, 국어, 영어, 수학이라는 4개의 변수를 담을 수 있는 클래스
  • __init__ : 생성자
    • 파이썬에서 클래스의 생성자를 만들 때 항상 동일한 규칙
    • __init__을 사용하면 클래스명을 쓰고 옆에 바로 인자들을 채워 넣음으로써 그 값들을 지닌 객체를 만들어 낼 수 있습니다.
class Student:
    name = ''
    korean = 0
    english = 0
    math = 0

    def __init__(self, name, kor, eng, math):
        self.name = name
        self.korean = kor
        self.english = eng
        self.math = math

    def say_hello(self):
        return '안녕하세요 {}님'.format(self.name)

    def average(self):
        return (self.korean + self.english + self.math) / 3
  • 클래스에서 사용하는 함수의 첫번째 인자를 self로 사용하는 것이 원칙입니다.

  • 홍길동 이라는 인스턴스(붕어빵) 생성
hgd = Student('홍길동', 80, 85, 75)
  • 인스턴스 이름 hgd이고, .을 찍으면 그 인스턴스의 변수에 접근할 수 있습니다.
print(hgd.average())
  • 클래스 선언 할 때는 def average(self)로 선언했는데, 실제로 사용할 때는 self는 빼고 그냥 hgd.average()라고 썼습니다. 왜냐하면 클래스의 함수는 선언할 때 첫번째 인자 self라고 선언하는 것이 원칙이고, 사용할 때는 self는 무조건 주어지는 것이 파이썬의 원칙이여서 빼고 사용합니다.

참고

profile
Sin prisa, sin pausa.

0개의 댓글