2014-12-12 1 views
2

여기에서 무슨 일이 일어나고 있는지 이해하는 데 어려움이 있습니다.__new__의 arg를 변경하면 __init__로 넘어 가지 않습니다.

class Test(object): 

    def __new__(cls, arg): 
     return object.__new__(cls, 345) 

    def __init__(self, arg): 
     self.arg = arg 

test = Test('testing') 
print 
print '****', test.arg 

이 작은 예제는 내가 가지고있는 혼란을 요약합니다. 새 함수 내에서 클래스를 만들 때 "테스트"문자열 대신 345 정수를 전달합니다. 그러나 나중에 arg를 검사 할 때 여전히 "테스트"문자열입니다.

class inch(float): 
    "Convert from inch to meter" 
    def __new__(cls, arg=0.0): 
     return float.__new__(cls, arg*0.0254) 
print inch(12) 

누군가가 차이가 여기에 무엇인지 설명 할 수 : 동시에

, 파이썬 문서에서이 예제는 작동합니까? 내가 찾고있는 기능을 사용할 수있는 방법이 있습니까?

+0

불변 형 또는 그와 유사한 것을 서브 클래 싱하는 경우에만이 기술을 사용하면됩니다. 그렇지 않다면,'__init__'을 사용하십시오. – Basic

답변

3

은 첫 번째 클래스 인수 이외의 인수를 모두 허용하지만 무시합니다. 이렇게하면 super().__new__을 호출하지 않고 하위 클래스의 __new__에 다른 인수를 추가 할 수 있습니다.

float.__new__은 두 번째 인수를 사용하여 값을 제공하는 별도의 함수입니다.

+0

나는 그것을 인식하지 못했습니다. 따라서 OP는 명시 적으로 새 객체를 초기화해야합니다. – Basic

+0

매우 흥미 롭습니다. 나는 그게 어떻게 작동하는지 알지 못했습니다. 항상 new에 제공되는 인수가 init에 전달된다는 생각. – Mathieson

+0

'Test .__ new__'에 대한 인수는'Test .__ init__'에 대한 * 암시 적 호출로 전달됩니다; 'object .__ init__'는'Test .__ init__'에서 * 명시 적으로 호출 된 경우에만 호출됩니다. – chepner

관련 문제