인프런 커뮤니티 질문&답변

달콤한 치와와님의 프로필 이미지
달콤한 치와와

작성한 질문수

프로그래밍 시작하기 : 파이썬 입문 (Inflearn Original)

Class(1-3)

왜 self.sound는 안 되는 건가요?

작성

·

280

1

def speak(self, sound):

        return '{} syas {}!'.format(self.name, sound)

이 부분 코드를

def speak(self, sound):

        return '{} syas {}!'.format(self.name, self.sound)

이렇게 self.sound로 하면 안 되는 이유가 무엇인가요?

답변 3

7

내용이 길 수도 있지만, 차근차근 설명을 시작하겠습니다.

def speak(self, sound):
        return '{} syas {}!'.format(self.name, self.sound)

sound 부분만 무작정 self로 하시면 안 됩니다~

self는 인스턴스를 요구하는데 인스턴스 생성한 c와 d를 보면

c = Dog('july', 4)d = Dog('Marry', 10)으로만 되어있죠?

name과 age에 대해서만 있고 sound에 대한건 없죠?

위 우님처럼 작성하고 코드를 실행시키면, Error가 발생합니다.

AttributeError: 'Dog' object has no attribute 'sound'

(속성 오류 : 'Dog'의 object(객체)에 'sound'라는 속성이 없다)

  • object : 객체라고 불리며,  여러가지 속성값과 행동을 가지고 있는 데이터
  • instance : 의미는 객체랑 비슷함. 객체 안에 인스턴스가 포함되어있음. 특정 object가 어떤 class의 객체인지를 관계 위주로 설명할 때 사용함.
  • 자세한 내용은 링크 참조해 주세요! (https://wikidocs.net/28) 클래스와 객체 부분을 보시면 될 것 같습니다!

오류가 발생해서 Dog의 object(객체)를

c = Dog('july', 4, 'Wal Wal') d = Dog('Marry', 10, 'Mung Mung')

이런 식으로 sound를 추가하여 수정하였습니다. 수정했으니 실행시켜야겠죠?

(print(c.speak('Wal Wal'))print(d.speak('Mung Mung'))이 부분에 있는 'Wal Wal', 'Mung Mung'삭제합니다)

(print(c.speak()) print(d.speak()) 이런 식으로요~)

실행시키면 오류가 또 납니다.

이번 오류는 아레와 같이 출력됩니다. 

TypeError : __init__() takes 3 positional arguments but 4 were given

(타입 오류 : __init__()는 3개의 인자를 받았지만, 4개가 주어졌다)

  • postional argument(위치 인자) : 일반적인 인자이며 함수에서 정의한 위치대로 대입하는 인자. (https://wikidocs.net/16053)

여기서 분명 Dog의 object(객체)에 3개를 주었는데 왜 4개가 되었는가?라고 의문이 들겠죠?

object(객체) 자신도 포함이 되었기 때문입니다 :)

그럼 __init__함수 정의한 부분을 수정해볼까요?

이런 식으로요

def __init__(self, name, age, sound):
    self.name = name
    self.age = age
    self.sound = sound

그리고 코드를 돌리면 또 오류가 납니다 (허허허허)

이번 오류는 이겁니다.

TypeError: speak() missing 1 required positional argument: 'sound'

(타임 오류 : speak()에 'sound'라는 1개의 필수 위치 인자가 없습니다)

def speak(self, sound):
      return "{} says {}!".format(self.name, self.sound)

이 부분에 def speak(self, sound):가 보이시죠? 그 부분에서  sound를 삭제시켜주시면 됩니다.

self는 자동으로 넘어가지만, sound는 입력받아서 직접 넘겨줘야하니깐요~

그리고 코드를 돌리면 짜잔 이제는 잘 돌아갑니다 :)

그래서 최종 코드로 다시 작성하면 이렇게 됩니다!

class Dog: # 모든 class는 object를 상속받는다.
    # 클래스 속성
    species = 'firstdog'

    # 초기화/인스턴스 속성
    def __init__(self, name, age, sound):
        self.name = name
        self.age = age
        self.sound = sound
        
    def info(self):
        return '{} is {} years old'.format(self.name, self.age)

    def speak(self):
        return "{} says {}!".format(self.name, self.sound)

c = Dog('july', 4, 'Wal Wal')
d = Dog('Marry', 10, 'Mung Mung')

# 메소드 호출
print(c.info())
print(d.info())

# 메소드 호출
print(c.speak())
print(d.speak())

원래 전 코드를 보면

class Dog: # 모든 class는 object를 상속받는다.
    # 클래스 속성
    species = 'firstdog'

    # 초기화/인스턴스 속성
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def info(self):
        return '{} is {} years old'.format(self.name, self.age)

    def speak(self, sound):
        return "{} says {}!".format(self.name, sound)


# 인스턴스 생성
c = Dog('july', 4)
d = Dog('Marry', 10)
# 메소드 호출
print(c.info())
print(d.info())
# 메소드 호출
print(c.speak('Wal Wal'))
print(d.speak('Mung Mung'))

이런 식으로 되어있죠?

최종 코드와 전 코드의 다른 점은

  1. init 메소드(초기화 메소드)가 달라짐
  2. def speak()부분도 달라라짐
  3. 인스턴스 생성부분도 달라짐
  4. 마지막 print문 출력에서 메소드 호출이 달라짐

이렇게 4가지가 달라졌습니다!

--------------------------------------------------------

요약하면, 최종 코드처럼 수정해야 Error 없이 실행됩니다 :) 

그리고 쉽게 설명한다고 해서 이렇게 설명을 작성했는데 잘 작성했는지 모르겠네요 ~

강사님이 한번 보시고 부족한 부분이 있으면 더 알려 주실 것 같아요~!

--------------------------------------------------------

도움이 되었으면 우측하단 또는 좌측하단에 하트 한번만 눌러주세요 :)

또한, 해결이 안된경우 답글 작성 부탁드립니다!

0

좋은사람님의 프로필 이미지
좋은사람
지식공유자

답변이 매우 정확합니다!!

0

친절한 설명 감사합니다! 이해가 잘 되었어요

도움 주셔서 감사합니다! ㅎㅎ

달콤한 치와와님의 프로필 이미지
달콤한 치와와

작성한 질문수

질문하기