안녕하세요!!!
클래스 공부하면서 심화문제를 풀다가 의문이 엄청 생겨버렸습니다.ㅜㅜ
의문을 해결하기 위해서 여러가지 시도를 해보았지만 아직 답을 못 찾고 있어서 글 남깁니다.
심화문제 35.6에서 if, else구문에서 아래의 코드가 있는데요
t = Time.from_string(time_string)Time.메서드로 선언한 것으로 보아 from_string은 클래스 메서드 혹은 정적 메서드라고 생각했습니다.
print(t.hour, t.minute, t.second)하지만, 두번 째 코드에서 클래스이름.요소로 접근하는 것이 아닌 것으로 보아 hour, minute, second는 인스턴스 요소임을 파악했습니다. 따라서 classmethod로 from_string()메서드를 구현해야 겠다고 생각하여 아래와 같이 코딩했습니다.
@classmethodcls는 자기자신으로 Time 클래스로 생각하고 Time클래스의 인스턴스 요소의 값을 바꾸기 위해서 cls.hour에 입력받은 hour를 대입했습니다.
def from_string(cls, time_string):
cls.hour, cls.minute, cls.second = map(int, time_string.split(':'))
여기서 오류가 나더군요.....
그래서 다시 훑어보면서 인스턴스 요소에 접근하기 위해서는 인스턴스 생성을 해야 함을 깨닫고 다시 아래와 같이 코딩을 했습니다.
@classmethodcls(hour, minute, second)는 Time(hour, minute, second)라고 생각하여 initialize메서드가 호출되어 아래의 코드에서 t인스턴스를 통해 hour, minute, second에 접근할 수 있다고 생각했습니다.
def from_string(cls, time_string):
hour, minute, second = map(int, time_string.split(':'))
cls(hour, minute, second)
t = Time.from_string(time_string)하지만 다시 에러가 납니다....ㅜㅜ
t인스턴스가 생성이 된 것이 아닌가요? hour를 참조할 수 없다는 에러가 떴습니다. 아니면 from_string메서드를 통해 인스턴스를 생성하는 과정이 이상한 건가요....? from_string에서 init메서드를 호출했으니 인스턴스 변수 값이 바뀌어서 t.hour가 작동되야 되는게 아닌가요? ㅜㅜ
이유를 모르겠습니다.....
그리고 클래스메서드에서 인스턴스변수를 바꿀 수는 없을까요? 또한 외부에서 클래스 메서드안에 선언된 요소의 값은 참조 못하나요?
class Test:
위와 같이 테스트를 해보았습니다. 클래스메서드에서 인스턴스변수를 가져오기 위해 cls.a를 return 하였습니다. cls.a가 t.a이기 때문입니다. 하지만 Test라는 객체는 a라는 속성이 없다는 오류가 발생합니다.
def __init__(self):
self.a = 1
@classmethod
def pop_instance_attribute(cls): # 인스턴스변수 반환 메서드
return cls.a
t = Test() # Test클래스의 t인스턴스 생성
print(t.pop_instance_attribute()) # t의 인스턴스변수 a 출력
계속 스스로 알아본 결과 classmethod는 인스턴스요소가 아닌 클래스요소만 접근이 가능한 것이고, 외부에서는 classmethod안에 구현된 요소에는 접근이 불가능한 것입니까....?
질문이 너무 길고 두서가 없어서 죄송합니다...ㅜㅜ
@classmethod로 from_string 메서드를 만들어야 하는 게 맞습니다.
@classmethod
def create(cls):
p = cls() # cls()로 인스턴스 생성
return p
UNIT 35.3의 예제가 기본 틀입니다. 인스턴스를 생성하면 생성한 인스턴스를 변수에 저장하고, 그 변수를 반환해줘야 create를 호출한 쪽에서 생성된 인스턴스를 받을 수 있습니다.
문의한 코드를 보면 return이 없으니까 클래스 메서드 내부에서 인스턴스를 생성하지만, 반환하지 않으니 메서드 호출 이후에 인스턴스가 사라지게 됩니다.
UNIT 35의 예제 코드와 비교해보세요.
클래스 메서드는 클래스 레벨에서 공유하는 것이고,
인스턴스 메서드는 인스턴스 레벨에서 공유하는 것입니다.
클래스는 시스템에 1개만 존재하는 것이고,
인스턴스는 생성하는 만큼 다수가 존재할 수 있습니다.
진부한 예지만, 붕어빵 틀(클래스)은 1개만 있어야 하고,
틀로 찍어 내는 붕어빵(인스턴스)는 메모리가 허용한다면
무한히 만들 수 있습니다.