>

코드는 다음과 같습니다

class MyTest: 
    def __init__(self):
         pass
    def __getattr__(self, attr):
        pass
t = MyTest()
print 'my test object: %r' %t

인쇄는 TypeError: 'NoneType' object is not callable 를 트리거합니다  난 단지 개체가 존재하는지 확인하려는있다. 이 코드는별로 유용하지 않습니다. 그러나 나는 큰 코드 기반에서 이와 같은 스텁 클래스를 가졌으므로

if module and module.class and module.class.propery:
   # do something with that property
 ...

Type Error: 'NoneType' object is not callable 를 얻었다  그러나 회선은 아무것도 호출하지 않습니다! 파이썬이 배후에서 암시 적으로 일부 함수를 호출한다고 생각합니다.

흥미롭게도 클래스가 Object 에서 상속하면 이런 일이 발생하지 않습니다.  

무슨 일이야?

  • 답변 # 1

    이전 스타일 클래스 __getattr__ 에서  매직 메소드를 포함하여보다 다양한 속성 액세스에 사용됩니다. 와이즈 비즈  운영자는 % 전화하려고   t.__repr__() 를 채우기 위해  자리 만 %r   t.__repr__ 에 의해 평가됩니다 t.__getattr__('__repr__') 를 리턴합니다. .

    None 에서  다른 매직 메소드가 호출되지만 동일한 문제가 발생합니다.

    if
    
    

    >>> class Foo: ... def __getattr__(self, attr): ... print(attr) ... >>> f = Foo(): >>> if f: ... pass __nonzero__ Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'NoneType' object is not callable , 새로운 스타일의 클래스를 사용하여  일반 메소드를 통해 속성을 찾을 수없는 경우에만 호출됩니다 ( __getattr__ 확인).  인스턴스 또는 인스턴스의 MRO에있는 클래스의 속성).

    __dict__
    
    

    >>> class Foo(object): ... def __init__(self): ... self.x = 3 ... def __getattr__(self, attr): ... print(attr) ... >>> f = Foo() >>> if f: ... pass ... >>> f.x 3 >>> f.y y 에서  케이스, if f  자체 f 구현하지 않습니다  또는 __nonzero__ 부모 __len__ 도 마찬가지입니다. 하지만,이 경우, 어떤 특성은 사용되지 않는다;그 object 사실  사실, 객체가 사용된다. f 에서 f.x  그 값이 직접 반환되도록, 인스턴스의 속성 딕셔너리에서 발견된다. 오직 x y 에 의해 달리 정의되지 않은 f 또는 Foo object 에 대한 호출을 호출합니다. .

  • 답변 # 2

    파이썬 2에서 구식 클래스를 사용하면 __getattr__ 를 호출하려고 할 때  객체에 (인쇄시), 당신은 __repr__ 이  전화했다.

    이 메소드를 심하게 스텁했기 때문에 __getattr__ 를 리턴합니다.  파이썬은 None 를 호출하려고합니다.  (이 방법을 기대하고 있기 때문에 반환 예정)

    None 에게 전화를 걸다  대신 작동합니다 :

    object.__getattr__
    
    

    인쇄 :

    class MyTest:
        def __init__(self):
             pass
        def __getattr__(self, attr):
            print(attr)   # so we see why getattr is called
            return object.__getattr__(self,attr)  # so it doesn't crash (neither it is useful...)
    t = MyTest()
    print ('my test object: %r' %t)
    
    

    이 특정 파이썬 2/이전 스타일 개체의 문제입니다. 파이썬 3 또는 새로운 스타일의 객체는 동일하게 동작하지 않습니다

    __repr__ my test object: <__main__.MyTest instance at 0x00000000031B3808>

관련 자료

  • 이전 c++ - Visual Studio 2010에서 Crypto ++를 어떻게 설치합니까?
  • 다음 typedef - 처음에 유형을 선언하고 나중에 C에서 정의 할 수 있습니까?