self나 __init__등 정확히 제대로 제 것으로 만들기가 힘들어요.(이해안가요)

미해결질문
띠리리 프로필

self는 정확히 정의가 무엇이고 예시로 어떻게 쓰이는지 저 혼자 따로

self를 이용하여 프로그램을 짜라하면 못만들 것 같아요.

그리고 다른 함수들도 다 self들어가 있는데

이 self를 안적으면 어떻게 되는지 오류가 난다면 왜 오류가 나는지

init생성자가 정의가 정확히 무엇이며

어떨때 쓰이는 것인지

간단한 예제로는 무엇이 있고

다른 class안의 함수와 init생성자의 차이는 무엇이며

생성자는 init하나 밖에 없는지 등 궁금하네요.

SungYong Lee 프로필
SungYong Lee 2018.07.31

안녕하세요. 다른 예제를 한번 더 보여드릴께요.

클래스에서 self의 의미는 '자기 자신'을 의미합니다.

아래와 같이 Student라는 클래스(붕어빵틀)을 만들었어요.

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

이름, 국어, 영어, 수학이라는 4개의 변수를 담을 수 있는 클래스입니다. 말씀하신 것처럼 __init__이라는 생성자가 있죠. 이 __init__은 파이썬에서 클래스의 생성자를 만들때 항상 동일한 규칙입니다. __init__을 사용하면 클래스명을 쓰고 옆에 바로 인자들을 채워 넣음으로써 그 값들을 지닌 객체를 만들어 낼 수 있죠.

네. 생성자는 init하나입니다!

파이썬에서는 클래스에서 사용하는 함수의 첫번째 인자(parameter)를 self로 사용하는 것이 원칙입니다.

설명이 어렵다면, 저 위의 코드가 컴퓨터에게 하는 말이 뭔지 풀어서 써볼께요.

"학생Student이라는 class(붕어빵틀)를 만들거야. 그 class는 이름, 국어, 영어, 수학의 값을 담을 수 있어. 사용자는 생성자를 이용해서 아무개, 국어점수, 영어점수, 수학점수 순으로 인자를 넣어서 인스턴스(붕어빵)를 찍어낼거야.

say_hello라는 함수는 "안녕하세요. (아무개의 이름)님"이라고 인사하는거야.

평균average라는 함수도 만들었는데, 그건 아무개의 국어점수, 아무개의 영어점수, 아무개의 수학점수를 다 더한 뒤 3으로 나눈 값을 돌려주는거야"

여기서 아무개는 즉 self가 되겠죠.

아래와 같이 홍길동이라는 인스턴스(붕어빵)을 만들어봅시다.

hgd = Student('홍길동', 80, 85, 75)

그리고

print(hgd.math)

하면 75가 출력될거에요.

여기서 인스턴스 이름은 hgd이고, 거기에서 점(.)을 찍으면 그 인스턴스의 변수에 접근할 수 있잖아요? 그래서 hgdmath변수의 값을 출력하니까 75가 되는 것이고요.

그런데 클래스(붕어빵틀)만 있는 상태에서는 hgd처럼 접근할 수 있는 방법이 없잖아요? 아직 인스턴스가 생성되지 않아서(=붕어빵이 만들어지지 않아서) 딱히 부를 만한 방법이 없잖아요. hgd는 홍길동이라는 이름을 갖는 인스턴스를 만든 후에나 사용할 수 있으니까요.

아래처럼 김갑수라는 인스턴스도 만들어봤어요.

kgs = Student('김갑수', 95, 90, 85)

그리고 아까 만든 홍길동과 지금 만든 김갑수의 average함수를 이용해봅시다.

print(hgd.average())

print(kgs.average())

결과는

80

90

이렇게 나올거에요.

맨 위에서 클래스 선언 할 때는 def average(self)로 선언했는데, 실제로 사용할 때는 self는 빼고 그냥 hgd.average()라고 썼죠. 왜냐하면, 클래스의 함수는 선언할 때 첫번째 인자는 self라고 선언하는 것이 원칙이고, 사용할 때는 self는 무조건 주어지는 것이 파이썬의 원칙이니까 그건 빼고 쓰는거에요.

이해가 충분히 되셨는지 궁금하네요. 혹시 더 궁금한 내용이 있으시다면 또 질문 올려주세요. 질문은 언제나 환영입니다.

띠리리 프로필
띠리리 2018.08.01

사용자는 생성자를 이용해서 아무개, 국어점수, 영어점수, 수학점수 순으로 인자를 넣어서 인스턴스(붕어빵)를 찍어낼거야. 라고 하셧는데,

def init(self, name, kor, eng, math):

    self.name = name

self.korean = kor

self.english = eng

self.math = math

생성자 init이 아니면

위와 같이 인자를 넣어 인스턴스를 만들 수 없는 것인가요?

SungYong Lee 프로필
SungYong Lee 2018.08.04

재질문이 들어와 있었네요!! __init__은 파이썬 사용자간의 약속입니다. 언더바를 앞 뒤에 붙인 __init__이 아닌 다른 이름으로는 인스턴스를 만들 수 없습니다. 그럼 에러가 날 거에요.