클래스 생성 소멸

조회수 366회
class cls:

    log = []

    def __init__(self, name):
        self.name = name    
        print(self.name + " 생성.")

    def add(self, val):    
        self.log.append(val)    

    def __del__(self):
        self.log.clear()  #################################### 이 부분
        print(self.name + " 소멸.")

logs = []

mycls = cls('a1')

mycls.add("aa1")

logs.append(mycls.log)


mycls = cls('b1')

mycls.add("bb2")

logs.append(mycls.log)


print(logs)

위 코드에서 logsaa1, bb2 만 저장할려고 합니다.
위 #####부분 삭제 하면 aa1,bb2 aa1, bb2로 저장 됩니다.
제가 C# 개발자여서 그런지 self.log.clear()가 없어야 될 것 같은데..
고수님 부탁드립니다.

1 답변

  • 작성하신 코드를 보면 cls 안의 log에 self가 붙어있지 않습니다.

    이렇게 작성하실 경우 log는 인스턴스 변수가 아니라 클래스 변수가 되는데, 클래스 변수는 모든 인스턴스가 공유합니다.

    즉, mycls에 새로운 인스턴스를 덮어씌우더라도 클래스 변수인 log는 계속 남아있게 됩니다.

    따라서 해당 log에 새로운 값을 추가하면 기존 값 뒤에 추가되는 것이고,

    logs.append(mycls.log)를 실행하면 logs라는 리스트에 같은 주소를 가리키는 리스트가 중복되어 추가되기 때문에 두 값이 항상 같아지게 됩니다.

    log를 __init__ 안으로 옮기시고 앞에 self를 붙이시면 원하시는 형태로 작동합니다.

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)