나는 당신이 원하는 것을 이해하지만, 이것과 비슷한 것을 일 수 있습니다. 일 수 있습니다. 이 기술을 사용하면 __init__
을 가질 수 없습니다. 왜냐하면 __new__
이 새 개체를 반환했는지 여부와 관계없이 과 관계없이이라고 표시되기 때문입니다.
>>> A()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: __new__() takes exactly 2 arguments (1 given)
>>> A(1)
A(1)
>>> A(A(1))
A(1)
class A(object):
def __new__(cls, obj):
if isinstance(obj, cls):
return obj
rv = object.__new__(cls)
# everything you would normally put in __init__
# goes here instead
rv._obj = obj
return rv
# for instance:
def __repr__(self):
return "A({})".format(repr(self._obj))
이
__init__
를 사용할 수없는 것은 당신이
A
를 서브 클래스해야 할 경우 특히 문제가된다.
class A(object):
def __new__(cls, obj):
if isinstance(obj, cls):
return obj
rv = object.__new__(cls)
rv._initialized = False
return rv
def __init__(self, obj):
if self._initialized: return
self._obj = obj
self._initialized = True
class B(A):
def __init__(self, obj):
if self._initialized: return
A.__init__(self, obj)
self._otherthing = "foo"
당신은 불행하게도, 모든 서브 클래스의 __init__
방법에 self._initialized
을 확인해야 : 여기 그 해결 방법입니다.
이것은 데코레이터처럼 보입니다. – 2rs2ts
두 가지 옵션 만 언급합니다 : 클래스의'__new__' 또는 변환 메소드. 아마도'__new__'는 유스 케이스에 따라 가장 합당 할 것입니다. – Claudiu