파이썬 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)
분명히 이것을하는 비열한 방법이있다.
젠장, 저에게 이길지라도이 점이 확실합니다. –
너무 쉬웠습니다. 감사! – Goodies
내가 보는 행동을 설명해 주시겠습니까? – Goodies