2013-06-27 2 views
7

먼저, 파이썬에서 클래스의 __init__() 함수가 값을 반환 할 수 없으므로 슬프게도이 옵션을 사용할 수 없습니다.파이썬 __init__ 생성 실패

내 코드의 구조로 인해 클래스의 __init__ 함수 내에서 데이터 어설 션 (및 사용자에게 정보를 제공하라는 메시지 표시)이있는 것이 좋습니다. 그러나 이것은 객체 생성이 실패 할 수 있음을 의미하며이를 정상적으로 복구 할 수 있기를 바랍니다.

나는 이것을 계속하는 가장 좋은 방법이 무엇인지 궁금해하고 있었다. 나는 글로벌 부울을 '유효한 생성'플래그로 설정하는 것을 고려해 왔지만 그렇게하지 않는 것이 좋습니다.

다른 모든 아이디어 (재구성 외에 어설 션은 초기화 외부에서 발생할 수 있으며 값은 인수로 전달됩니다)? 기본적으로 성공시 0을 반환하고 초기화하는 동안 -1을 반환하는 방법을 찾고 있습니다. (대부분의 C 시스템 호출과 마찬가지)

+8

예외가 발생합니다. –

+1

성공시 0을 반환하고 실패시 -1을 반환하는 것은 매우 비 환상적입니다. 오류를 반환하는 것은 무시하기 쉽고 처리하기가 복잡하기 때문에 좋지 않습니다. 그 중 0과 -1을 부울 값으로 사용하면 혼란이 생기고 이점이 없습니다. 파이썬을 사용하여 C 코드를 작성하는 것은 사실이 아닙니다. – abarnert

+0

@bsbueno가 답변에서 지적했듯이, 클래스 인스턴스는 생성되지 않은'__init __()'에 초기화되어 있습니다. 그래서 값을'반환 '하지 않습니다. 전역 변수를 사용하여 실패를 감지하거나 예외를 던지는 대신 클래스에 데이터 멤버를 추가하여 클래스의 상태를 표시 한 다음 값을 직접 확인하거나'__init __() '뒤에 값을 반환하는 메서드를 호출 할 수 있습니다 잘못되었을 때 무엇이 ​​(그리고 아마도 무엇이) 있는지를 결정하기 위해 호출되었습니다. – martineau

답변

11

assertio 하나가 실패 할 때 예외를 발생시킬 수도 있고, -, 당신이 정말로 원하는하지 않거나 예외 일 수없는 경우에, 당신은 당신의 클래스에 __new__ 방법을 쓸 수있다 - 파이썬에서 는 __init__은 기술적으로이다 "이니셜 라이저"메소드 - 속성을 채워야하고, 라이프 사이클 동안 객체가 필요로하는 일부 자원 및 리소스를 확보해야합니다. - 그러나 파이썬은 __init__ 이전에 호출되는 실제 생성자 __new__ 메소드를 정의합니다. 이와 달리 __new__은 실제로 새로 생성 된 (초기화되지 않은) 인스턴스 자체를 값을 반환합니다.

그래서 수표를 __new__ 안에 넣고 간단히 None을 반환합니다. 그렇지 않으면 수퍼 클래스 __new__ 메서드 호출에 대한 결과를 반환합니다 (순수 파이썬에서 객체에 대한 실제 메모리 할당을 수행 할 수 없습니다. 그래서 궁극적으로는 슈퍼 클래스에서 네이티브 코드로 작성 생성자를 호출해야 - 일반적으로이 클래스 계층 구조의베이스 object.__new__입니다

NB :. 파이썬이, 당신의 기본 클래스로 object이 있어야합니다 귀하의 계층 구조 - 그렇지 않으면 __new__뿐만 아니라, 나중에 많은 기능이 파이썬 개체에 추가 된 것처럼 작동하지 않습니다. 즉, class MyClass(object):, 결코 class MyClass: - Python3을 사용하지 않는 한.

+0

'__new__'은'__init__' 전에 호출됩니다. 방금 시도했지만, 클래스의 인스턴스를 만들 때'__new__'는 호출되지 않습니다 (Py2.7). –

+0

찾았습니다. 클래스에서 객체를 확장해야합니다. 그것 없이는 새로운 것이 부름받지 않을 것입니다! –

+0

아니요. 객체 기본 클래스를 생략하면'__new__'이 자동으로 호출되지 않습니다. 그림을 이동! –

0

예외를 제기 한 적이 있습니까? 이것이 실패를 알리는 일반적인 방법입니다.