2014-04-04 3 views
51

이 코드 ...Python3 변수 이름의 간단한 차이가 코드 실행 방식을 바꿀 수 있습니까?

class Person: 
    num_of_people = 0 

    def __init__(self, name): 
     self.name = name 
     Person.num_of_people += 1 

    def __del__(self): 
     Person.num_of_people -= 1 

    def __str__(self): 
     return 'Hello, my name is ' + self.name 

cb = Person('Corey') 
kb = Person('Katie') 
v = Person('Val') 

다음과 같은 오류 ...

Exception AttributeError: "'NoneType' object has no attribute 'num_of_people'" in <bound method Person.__del__ of <__main__.Person object at 0x7f5593632590>> ignored 

를 생성하지만이 코드는하지 않습니다.

class Person: 
    num_of_people = 0 

    def __init__(self, name): 
     self.name = name 
     Person.num_of_people += 1 

    def __del__(self): 
     Person.num_of_people -= 1 

    def __str__(self): 
     return 'Hello, my name is ' + self.name 

cb = Person('Corey') 
kb = Person('Katie') 
vb = Person('Val') 

유일한 차이점은 마지막 변수 이름이 "vb"vs "v"입니다.

저는 Python을 배우고 있으며 OOP 관련 작업을하고 있습니다.

+2

@StevenRumbalski : 간단히 말해서, 그렇습니다. 그러나 통역관 출입구에서만. –

+6

첫 번째 코드는 예외를 생성하지 않습니다. 완전한 추적을 보여주세요. (수정 : Python 3.3 이상에서는 예외가 생성되지 않습니다. 3.2에서는 예외가 있습니다.) – geoffspear

+0

@Wooble Nah! 그것이 내가 잃어버린 것입니다. – aIKid

답변

59

네, 직접 변수 이름이 아니기는하지만 그렇습니다.

파이썬이 종료되면 모든 모듈도 삭제됩니다. 모듈을 정리하는 방법은 모듈의 모든 전역을 None으로 설정하여 참조가 더 이상 원래 개체를 참조하지 않도록합니다. 이러한 전역 변수는 사전 개체의 키이며 사전이 임의로 정렬되므로 변수 하나의 이름을 변경하면 변수가 지워지는 순서가 변경 될 수 있습니다.

v의 이름을 vb으로 변경하면 변수가 지워지는 순서가 변경되어 이제 Person이 마지막으로 지워집니다. PersonNone로 설정되지 않은 경우 인스턴스가 항상 여전히 클래스를 참조, 또는 검사를하기 때문에

def __del__(self): 
    type(self).num_of_people -= 1 

:

하나는 해결 방법 대신 __del__ 방법에 type(self).num_of_people -= 1을 사용하는 것입니다

def __del__(self): 
    if Person is not None: 
     Person.num_of_people -= 1 

두 노트 :

  • CPython 3.4는 더 이상 None (대부분의 경우)으로 전역을 설정하지 않으며 Safe Object Finalization; PEP 442을 참조하십시오.

  • CPython 3.3은 globals 사전에 사용 된 str 키에 자동으로 randomized hash salt을 적용합니다. 이것은 당신이 관찰 한 행동을 더욱 무작위로 만들고 코드를 여러 번 다시 실행하면 오류 메시지가 나타나거나 나타나지 않을 수 있습니다.

+2

어 ... 대답은 훌륭하지만, 나는 이것을 정말로 이해하지 못합니다. intepreter exit에서 무엇을 의미합니까? 설명해 주시겠습니까? – aIKid

+3

@aIKid : 파이썬이 종료 될 때 (또는 모듈에 대한 모든 참조를 제거하고'sys.modules'에서 모듈을 삭제하면 모듈을 삭제하지만 자주 수행되지는 않습니다) 모듈'__del__'이 호출되고 먼저 이름을 '없음'으로 리 바인드하여 모듈의 모든 전역을 지 웁니다. –

+0

그래서 우리는 인터프리터를 종료 할 때 예외가 발생합니다. <- 그건 거짓말니까? – aIKid