2016-11-29 5 views
0

나는 파이썬 커맨드 라인 아래에 다음과 같은 코드가있다. 속성을 방문하면 getattribute이 자동으로 호출됩니다. 하지만인스턴스 방문시 python __getattribute__이 (가) 호출되지 않습니다?

class D: 
    def __getattribute__(s,*a,**ka): 
    print "__getattribute__" 
    return object.__getattribute__(s,*a,**ka) 

    def __getattr__(s,name): 
    print "__getattr__" 
    return name 

    def __get__(s,instance,owner): 
    print "__get__" 
    return s 
    a='abc' 

class C2(object): 
    d=D() 

>>> d=D() 
>>> c2=C2() 
>>> print d.a 
abc 
>>> print d.zzz 
__getattr__ 

없음 "getAttribute를는"인쇄 결과를 볼 수 없습니다. 왜? 새로운 스타일의 클래스 D (객체)에

+0

[차이점 사이의 차이점] 가능한 복제본 [getattr \ _ \ _ vs \ _ \ _ getattribute \ _ \ _] (http://stackoverflow.com/questions/3278077/difference-between-getattr-vs-getattribute) –

답변

1

은 이전 스타일이 아닌 새로운 스타일입니다. __getattribute__ is used for new-style classes only.

원칙적으로 Python 2에서 실행될 수있는 모든 모듈의 맨 위에 다음과 같은 코드를 추가하여 정의 된 모든 클래스가 암시 적으로 새로운 스타일인지 확인합니다 (Py3에는 아무런 영향을 미치지 않습니다.) :

__metaclass__ = type 

또는 새 스타일의 클래스를 얻으려면 object (또는 사용자의 필요에 맞는 새로운 스타일의 클래스)을 명시 적으로 상속 할 수 있습니다.

0

변경 클래스 D : 당신은 파이썬이, 당신의 D 클래스를 실행하는

class D(object): 
    def __getattribute__(s,*a,**ka): 
    print "__getattribute__" 
    return object.__getattribute__(s,*a,**ka) 

    def __getattr__(s,name): 
    print "__getattr__" 
    return name 

    def __get__(s,instance,owner): 
    print "__get__" 
    return s