저는 초보자를 위한 파이썬 300제라는 온라인 교재📕로 학습하고 정리합니다. 문제 출처를 미리 밝힙니다.
초보자를 위한 웅앵웅이래서 쉬운 줄 알았더니... 착각은 자유.
클래스, 객체, 인스턴스에 대해 설명해봅시다.
정답👏
이건 사실 풀이는 없는데 책을 통한 비유를 적어도 될 것 같고, 개념 정리를 찾아보아도 좋을 것 같습니다
비어있는 사람 (Human) 클래스를 "정의" 해보세요.
class Human:
pass
정답👏
사람 (Human) 클래스의 인스턴스를 "생성" 하고 이를 areum 변수로 바인딩해보세요.
class Human:
pass
areum = Human()
정답👏
사람 (Human) 클래스에 "응애응애"를 출력하는 생성자를 추가하세요.
>>> areum = Human()
응애응애
class Human:
print("응애응애")
땡💢
class Human:
def __init__(self):
print("응애응애")
정답👏
해당 오답의 경우, 클래스 안에서 출력하려면 메서드가 필요함을 알 수 있다.
사람 (Human) 클래스에 (이름, 나이, 성별)을 받는 생성자를 추가하세요.
>>> areum = Human("아름", 25, "여자")
class Human:
def __init__(self, name, age, sex):
self.name = name
self.age = age
self.sex = sex
areum = Human("아름", 25, "여자")로 바로 부르려면 init 메서드가 필요함을 알 수 있다.
>>> areum = Human("아름", 25, "여자")
>>> print(areum.name)
아름
정답👏
255에서 생성한 인스턴스의 이름, 나이, 성별을 출력하세요.
인스턴스 변수에 접근하여 값을 출력하면 됩니다.
이름: 조아름, 나이: 25, 성별: 여자
인스턴스 변수에 접근하여 값을 가져오는 예
>>> areum.age
25
문제가 좀 헷갈리게 되어 있는데, 위에서 만든 클래스를 가지고 이름, 나이, 성별을 입력하여 인스턴스 변수로 호출하라는 의미입니다.
>>> class Human:
def __init__(self, name, age, sex):
self.name = name
self.age = age
self.sex = sex
>>> areum = Human('조아름', 25, '여자')
>>> areum.age
25
정답👏
사람 (Human) 클래스에서 이름, 나이, 성별을 출력하는 who() 메소드를 추가하세요.
>>> areum.who()
이름: 조아름, 나이: 25, 성별: 여자
>>> class Human:
def __init__(self, name, age, sex):
self.name = name
self.age = age
self.sex = sex
def who(self):
print("이름: {}, 나이: {}, 성별: {}".format(self.name, self.age, self.sex))
정답👏
사람 (Human) 클래스에 (이름, 나이, 성별)을 받는 setInfo 메소드를 추가하세요.
땡💢
>>> areum = Human("모름", 0, "모름")
>>> areum.setInfo("아름", 25, "여자")
>>> class Human:
def __init__(self, name, age, sex):
self.name = name
self.age = age
self.sex = sex
def who(self):
print("이름: {}, 나이: {}, 성별: {}".format(self.name, self.age, self.sex))
def setInfo(self):
self.name = name
self.age = age
self.sex = sex
>>> areum = Human("모름", 0, "모름")
>>> areum.name
모름
>>> areum.setInfo("아름", 25, "여자")
>>> areum.name
아름
그런데 왜 setInfo의 메서드를 추가했을까요? init 생성자가 있지만, 정보를 잘못 입력했을 경우 다시 입력해주는 메서드입니다.
객체를 생성할 때 이름을 몰라서 '모름'이라고 했다가, 나중에 이름을 알아서 넣어줄 때 setInfo 메서드를 이용하면 됩니다.
사람 (human) 클래스에 "나의 죽음을 알리지 말라"를 출력하는 소멸자를 추가하세요.
>>> areum = Human("아름", 25, "여자")
>>> del areum
나의 죽음을 알리지 말라
땡💢 틀렸음. 소멸자라 그래서 뭐지? 했는데 안 배운 개념이었다.
객체가 생성될 때 자동으로 init이라는 생성자 메서드가 호출되는 것처럼
객체가 메모리에서 소멸될 때 자동으로 호출되는 메소드가 있는데 이를 소멸자라고 부른다고 합니다.
class Human:
def __init__(self, name, age, sex):
self.name = name
self.age = age
self.sex = sex
def __del__(self):
print("나의 죽음을 알리지마라")
def who(self):
print("이름: {} 나이: {} 성별: {}".format(self.name, self.age, self.sex))
def setInfo(self, name, age, sex):
self.name = name
self.age = age
self.sex = sex
areum = Human("아름", 25, "여자")
del(areum)
소멸자는
def __del__(self):
이런식으로 사용하는 것 같습니다.
사용은 불러온 객체를 삭제하는
del(areum)
해당 방법이 있습니다.
아래와 같은 에러가 발생한 원인에 대해 설명하세요.
class OMG :
def print() :
print("Oh my god")
myStock = OMG()
myStock.print()
TypeError Traceback (most recent call last)
<ipython-input-233-c85c04535b22> in <module>()
----> myStock.print()
TypeError: print() takes 0 positional arguments but 1 was given
내가 생각한 답: 매개변수가 1개도 설정되어 있지 않아서
class OMG :
def print() :
print("Oh my god")
myStock = OMG()
myStock.print() # OMG.print(mystock)
위의 코드를 실행하면 실제로 호출하는 값은 'OMG.print(myStock)'입니다. 하지만 print 메서드 안에는 인자가 없기 때문에 error가 발생합니다.
그렇다면 위의 코드를 고쳐준다면 어떻게 고쳐줘야 할까요?
class OMG :
def print(self) :
print("Oh my god")
myStock = OMG()
myStock.print() # OMG.print(mystock)
print() 라는 메서드 안에 self를 넣어주면 됩니다!