작성
·
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'라는 속성이 없다)
오류가 발생해서 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개가 주어졌다)
여기서 분명 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'))
이런 식으로 되어있죠?
최종 코드와 전 코드의 다른 점은
이렇게 4가지가 달라졌습니다!
--------------------------------------------------------
요약하면, 최종 코드처럼 수정해야 Error 없이 실행됩니다 :)
그리고 쉽게 설명한다고 해서 이렇게 설명을 작성했는데 잘 작성했는지 모르겠네요 ~
강사님이 한번 보시고 부족한 부분이 있으면 더 알려 주실 것 같아요~!
--------------------------------------------------------
도움이 되었으면 우측하단 또는 좌측하단에 하트 한번만 눌러주세요 :)
또한, 해결이 안된경우 답글 작성 부탁드립니다!
0
0