2014-10-19 1 views
0

__new__의 몸 안에 당신이하지 반환을 (그렇지 않으면 기본, 메타 또는) __new__의 클래스의 버전을 다른 호출의 결과를 할 것을 파이썬 등의 __new__를 사용하는 예를 무엇입니까,하지만 당신은 반환을 __init__이 호출되도록 의도 된 클래스의 인스턴스를 할당 했습니까?파이썬 __new__ 다른 클래스의 버전을 호출하지 않고 __new__?

매우 드물기는하지만,이 유스 케이스의 예가 있으면 궁금합니다. 나는 의 tuple의 구현과 심지어 type의 구현에 대한 Python 소스를 검색해 보았습니다. 그러나 이것은 온라인에서 쉽게 찾을 수있는 것처럼 보이지 않았습니다.

+2

"할당 된 인스턴스"는 무엇을 의미합니까? '__new__'을 사용하여 같은 클래스의 기존 인스턴스를 반환하는 [Singleton] (http://stackoverflow.com/a/1810367/1427416)과 같은 것들이 있지만 초기 인스턴스를 생성하는 데 여전히'__new__'가 사용됩니다 , 그리고 __init__를 다시 부르는 것은 틀림없이 거기에서도 바람직하지 않다 (비록 그 예에서 일어난다). 어떤 시점에서 내장 객체'.__ new__'를 활용하지 않고 사용자 정의 클래스의 실제 새로운 인스턴스를 생성 할 방법이 없습니다. 'tuple'과'type'은 C에서 구현되어서 실제로'__new__'와 같은 API를 사용하지 않습니다. – BrenBarn

+0

"할당 된 인스턴스"는 단지'__new__'이 반환하는 것을 의미합니다. '__new__ '다른 것을 바닥에 두지 않고 어떻게 새로운 일을 만들어 낼 수 있습니까? 아니면 잘못된 질문입니까? – ely

+0

수 없습니다. 다른 클래스의 '__new__'을 호출하거나 다른 클래스/타입을 호출하여 객체를 생성해야합니다.이 객체는 해당 클래스의'__new__ '을 호출합니다. – BrenBarn

답변

1

당신은 파이썬 측에서 할 수있는 일이 아닙니다. no-op __new__ 메서드는 의 노출 된 인스턴스를 반환하는 object.__new__(cls)을 호출합니다.

>>> class A: 
...  def __new__(cls): 
...   return object.__new__(cls) 
... 
>>> A() 
<__main__.A object at 0x7f9e951577d0> 
+0

'tuple .__ new__','object .__ new__','type .__ new__'와 같은 것들은 C 레벨에서 구현되어 있고'C '클래스의 유일한 동작 집합을 정의합니다. __new__'. 클래스의 경우, 체인 아래의 어떤 레벨에서, 당신은 내장 타입의'__new__' (또는'object's)에 의존하고 있으며, 메타 클래스는'type'을 위해 있습니다. 'tuple'을위한 시퀀스 형 불변성 외에도'__new__'에는 어떤 종류의 불변성이 있습니까? – ely

+0

@EMS : "불변의 종류"란 무엇입니까? – BrenBarn

+0

'tuple '을 서브 클래 싱하는 것은 맞춤 속성과 불변성을 얻는 방법이지만 다른 클래스 속성은 가져 오는 방법이 아닙니다. 설명자를 사용하는 것은 일을 읽기 전용으로 만들 수 있지만 합법적 인 것은 불가능하게 만드는 한 가지 방법입니다. 'object .__ setattr__'가 attrs를 조정하는 것은 아니지만, 아마도 임의의 속성이나'__new__'에 정의 된 것들을 가지고 있다고 생각합니다. – ely

관련 문제