programing tip

__init__ 외부에 정의 된 인스턴스 속성 attribute_name

itbloger 2020. 7. 1. 08:16
반응형

__init__ 외부에 정의 된 인스턴스 속성 attribute_name


다음과 같이 여러 함수를 호출하도록하여 클래스 생성자를 분할했습니다.

class Wizard:
    def __init__(self, argv):
        self.parse_arguments(argv)
        self.wave_wand() # declaration omitted

    def parse_arguments(self, argv):
        if self.has_correct_argument_count(argv):
            self.name = argv[0]
            self.magic_ability = argv[1]
        else:
            raise InvalidArgumentsException() # declaration omitted

# ... irrelevant functions omitted

통역사가 행복하게 코드를 실행하는 동안 Pylint는 다음과 같은 불만을 제기합니다.

Instance attribute attribute_name defined outside __init__

복잡한 Google 검색은 현재 성과가 없습니다. 모든 생성자 논리를 유지하는 것은 구성 __init__되지 않은 것으로 보이며 Pylint 경고를 끄는 것도 해킹처럼 보입니다.

A /이란 무엇입니까 파이썬 이 문제를 해결하는 방법은?


이 메시지의 기본 개념은 가독성을위한 것입니다. 인스턴스의 __init__메소드 를 읽어 인스턴스가 가질 수있는 모든 속성을 찾을 것으로 예상합니다 .

그래도 초기화를 다른 방법으로 분할하고 싶을 수도 있습니다. 이 경우 하위 초기화 메소드를 호출하여 속성을 None약간의 문서와 함께 간단히 할당 할 수 있습니다 __init__.


필요에 따라 튜플을 반환하고 parse_arguments()속성 내부 __init__압축을 푸십시오 .

또한을 사용하는 대신 예외를 사용하는 것이 좋습니다 exit(1). 당신은 역 추적, 코드 재사용 등을 얻습니다.

class Wizard:
    def __init__(self, argv):
        self.name,self.magic_ability = self.parse_arguments(argv)

    def parse_arguments(self, argv):
        assert len(argv) == 2
        return argv[0],argv[1]

함수를 통해 설정하려는 각 속성에 대해 init에서 함수를 호출하십시오. 예를 들어 다음은 ascii_txt 속성을 설정하는 데 효과적입니다 ...

def __init__(self, raw_file=None, fingerprint=None):
    self.raw_file = raw_file
    self.ascii_txt = self.convert_resume_to_ascii()

def convert_resume_to_ascii(self):
    ret_val = self.raw_file.upper()
    return ret_val

init 외부의 인스턴스 변수 정의는 일반적으로 권장되지 않지만 자연스럽지 않은 경우는 드 rare니다. 예를 들어, 하위 클래스에서 사용하지 않을 여러 변수를 정의하고 그 정의로 인해 하위 낭비 시간이나 자원을 만들거나 단순히 미학적 인 변수를 정의하는 상위 클래스가있는 경우.

이에 대한 한 가지 가능한 해결책은 init-extention 함수를 사용하는 것입니다. 각 자식 클래스는 대체 할 수 있으며이 함수에서는 클래스 고유 인스턴스 변수를 정의하기 위해 함수 setattr을 사용합니다. 이것이 너무 심미적이지는 않지만 여기서 논의 된 보푸라기 경고를 제거합니다.

참고 URL : https://stackoverflow.com/questions/19284857/instance-attribute-attribute-name-defined-outside-init

반응형