2010-06-29 7 views
12

난 그냥 다음과 같은 버그에 너무 오래 소요 :Python : 클래스가 클라이언트에 새로운 속성을 설정하도록 허용 할 수 있습니까?

>>> class Odp(): 
    def __init__(self): 
     self.foo = "bar" 


>>> o = Odp() 
>>> o.raw_foo = 3 # oops - meant o.foo 

내가 속성을 가진 클래스가 있습니다. 나는 그것을 설정하려고 노력했는데 왜 효과가 없는지 궁금해했습니다. 그런 다음 원래 클래스 정의로 돌아가서 속성의 이름이 약간 다른 것으로 나타났습니다. 따라서 나는 새 속성을 만들거나 설정하는 대신 새로운 속성을 설정하거나 설정하고있었습니다.

먼저 정적 유형 언어가 방지해야하는 오류 유형이 아닙니다. 이 경우 동적 타이핑의 이점은 무엇입니까?

두 번째로, Odp을 정의 할 때 내가 이것을 금지 할 수있는 방법이 있습니까? 그러면 문제가 해결되지 않았습니까?

+1

가능한 복제본 : http://stackoverflow.com/questions/3079306/how-to-protect-againt-typos-when-setting-value-for-class-members – detly

답변

16

당신은 목적으로 __setattr__ 방법을 구현할 수 있습니다 - 그것은 훨씬 더 강력한 종종 클래스에서 상속 할 때 "손실"(예를 들어, __slots__가 자동적 목적으로 오용하는 __slots__ 이상이다, __setattr__하지 않는 한 살아있는 동안 명시 적으로 재정의).

def __setattr__(self, name, value): 
    if hasattr(self, name): 
    object.__setattr__(self, name, value) 
    else: 
    raise TypeError('Cannot set name %r on object of type %s' % (
        name, self.__class__.__name__)) 

당신은 hasattr 당신이 클래스 레벨에서 속성을 설정하거나 오히려 __init__ 방법에 object.__setattr__를 사용하여 예를 들어, 설정할 수 싶어 이름에 대한 성공 확인해야합니다 직접적인 속성 할당보다. (클래스에서 인스턴스이 아닌 속성을 설정하는 것을 금지하려면 유사한 특수 방법으로 사용자 정의 메타 클래스를 정의해야합니다.

+0

왜 TypeError를 선택 했습니까? 아마도 부당하게, 나는 AttributeError를 염두에 두었다. – n611x007

+2

"XX 할당을 지원하지 않습니다"라는 메시지 (예 : 항목)는 'TypeError'를 사용하고,'XX가 없으면 'AttributeError를 사용하므로 혼란 스럽습니다. –

관련 문제