2016-07-22 1 views
4

파이썬 3에서 cls의 인스턴스가 아닌 값이 반환되면 __init__ 메서드는 호출되지 않습니다. 그래서, 예를 들어,이 작업을 수행 할 수 있습니다 나는 순서가 __call__ 것을 인상했다Python2/3에서 __new__와 __init__ 순서의 차이

class Foo: 
    @staticmethod 
    def bar(n): 
     return n * 5 

    def __new__(cls, n): 
     return Foo.bar(n) 

print(Foo(3)) # => 15 

(가 인스턴스 인 경우) ->__new__ ->__init__.

그러나 파이썬 2에서는 __init__이 없어서 TypeError: this constructor takes no arguments이 발생하는 것으로 보입니다. object에서 상속하면 해결할 수 있습니다. 따라서 다음을 실행하십시오 :

저는 파이썬 2에서 메타 클래스를 사용했습니다.

Meta = type("Meta", (type,), dict(__call__=lambda self, x: x * 5)) 

class Foo(object): 
    __metaclass__ = Meta 

print(Foo(4)) # => 20 

init/new 메소드가 바뀌었기 때문에 파이썬 3에서는 작동하지 않습니다.

이 작업을 수행 할 수있는 Python2/3 호환 방법이 있습니까?

해결책 :

이것은 내가 한 것과 같습니다. 나는 그것을 좋아하지 않지만 작동한다. :

class Foo(object): 
    @staticmethod 
    def __call__(i): 
     return i * 5 

    def __new__(cls, i): 
     return Foo.__call__(i) 

분명히 이것을하는 비열한 방법이있다.

답변

6

파이썬 2에서는 새로운 스타일의 클래스를 사용하여 클래스를 올바르게 작동시켜야합니다. 즉, 클래스를 class Foo(object)으로 정의해야합니다. 그렇다면 첫 번째 예제는 Python 2와 Python 3에서 모두 작동합니다.

+0

젠장, 저에게 이길지라도이 점이 확실합니다. –

+0

너무 쉬웠습니다. 감사! – Goodies

+0

내가 보는 행동을 설명해 주시겠습니까? – Goodies