내부에서 예외를 발생시키는 것이 나쁜 형태로 간주 __init__
됩니까? 그렇다면 특정 클래스 변수가 None
잘못된 유형 으로 초기화 될 때 허용되는 오류를 던지는 방법은 무엇입니까?
내부에서 예외를 발생시키는 것이 나쁜 형태로 간주 __init__
됩니까? 그렇다면 특정 클래스 변수가 None
잘못된 유형 으로 초기화 될 때 허용되는 오류를 던지는 방법은 무엇입니까?
답변:
예외를 발생시키는 __init__()
것은 절대적으로 좋습니다. 생성자 내에서 오류 조건을 나타내는 다른 좋은 방법은 없으며 표준 라이브러리에는 개체를 빌드 할 때 예외가 발생할 수있는 수백 가지의 예제가 있습니다.
물론 발생하는 오류 클래스는 사용자에게 달려 있습니다. ValueError
생성자에 잘못된 매개 변수가 전달 된 경우 가장 좋습니다.
ValueError
및 TypeError
입니다.
__init__
생성자, 그 초 기자입니다. 행을 편집하고 싶을 수도 있습니다 . 생성자 내에서 오류 조건을 나타내는 다른 좋은 방법은 없습니다 ..
생성자에서 오류를 표시하는 유일한 올바른 방법은 예외를 발생시키는 것입니다. 그렇기 때문에 C ++ 및 예외 안전을 염두에두고 설계된 다른 객체 지향 언어에서 객체의 생성자에 예외가 발생하면 소멸자가 호출되지 않습니다 (객체 초기화가 불완전 함을 의미 함). 파이썬과 같은 스크립팅 언어에서는 그렇지 않습니다. 예를 들어, 다음 코드는 socket.connect ()가 실패하면 AttributeError를 발생시킵니다.
class NetworkInterface:
def __init__(self, address)
self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.socket.connect(address)
self.stream = self.socket.makefile()
def __del__(self)
self.stream.close()
self.socket.close()
그 이유는 연결 시도가 실패한 후 스트림 속성이 초기화되기 전에 불완전한 객체의 소멸자가 호출되기 때문입니다. 생성자로부터 예외를 던지는 것을 피해서는 안됩니다. 파이썬에서 완전히 예외 안전 코드를 작성하는 것이 어렵다고 말하고 있습니다. 일부 파이썬 개발자는 소멸자를 사용하지 않는 것이 좋지만 또 다른 논쟁의 문제입니다.
__del__
가 잘못 작성 . this->p_socket->close()
C ++의 소멸자에서 똑같은 문제가 발생했습니다 . C ++에서는 그렇게하지 않을 것입니다. 멤버 객체가 스스로 파괴되도록 할 것입니다. 파이썬에서도 똑같이하십시오.
위의 모든 내용에 동의합니다.
예외를 발생시키는 것 외에 객체를 초기화 할 때 무언가 잘못되었다는 신호를 보내는 다른 방법은 없습니다.
클래스의 상태가 그 클래스의 입력에 전적으로 의존하는 대부분의 프로그램 클래스에서 우리는 어떤 종류의 ValueError 또는 TypeError가 발생할 것으로 기대할 수 있습니다.
네트워크 장치를 사용할 수 없거나 캔버스 개체를 쓸 수없는 경우 부작용이있는 클래스 (예 : 네트워킹 또는 그래픽을 수행하는 클래스)에서 초기화 오류가 발생할 수 있습니다. 실패 조건에 대해 가능한 한 빨리 알고 싶어하기 때문에 이것은 나에게 합리적입니다.