2014-04-04 2 views
1
class A(): 
    ... 

나는 매개 변수로 어떤 객체로 초기화되는 클래스 A을 원하지만 __init__A 유형에 갈 때, 그것은 오래된 A 개체를 반환/떠나 래퍼 A(A())를 작성 해달라고한다.래퍼 객체 자체를 감싸는 것을 방지하려면 어떻게해야합니까?

__new__ 메서드를 덮어 쓰는 것이 해결책이라고 생각하지만 object creator을 만들고 결과로 주어진 매개 변수를 반환하는 방법을 생각해보십시오.

내 해결 방법은 지금 바로 추천 :

def ToA(it): 
    if type(it) == A: 
     return it 
    else: 
     return A(it) 

하지만 A(A())의 직접 사용을 방지하기 위해 블록 든 A이 필요합니다.

+0

이것은 데코레이터처럼 보입니다. – 2rs2ts

+0

두 가지 옵션 만 언급합니다 : 클래스의'__new__' 또는 변환 메소드. 아마도'__new__'는 유스 케이스에 따라 가장 합당 할 것입니다. – Claudiu

답변

0

나는 당신이 원하는 것을 이해하지만, 이것과 비슷한 것을 일 수 있습니다. 일 수 있습니다. 이 기술을 사용하면 __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을 확인해야 : 여기 그 해결 방법입니다.

+0

좋은 속임수, 나는''__new__''만으로 타입을 검사하는 데에 싸우고 있었고 나머지는''__init__''에있었습니다 - 저의 실수. –

+0

'type (obj) is cls '대신에'isinstance (obj, cls)'를 사용해야만합니다.'A'가 서브 클래 싱 되어도 제대로 작동하지 않을 것입니다. – zwol

+0

가 이해되었습니다. 하위 클래스 중 하나에''__init__''를 추가하지 말아야합니다. 조금 문제가 있습니다. –

관련 문제