programing

인스턴스 속성 attribute_name이 __init__ 외부에 정의되어 있습니다.

firstcheck 2022. 10. 18. 21:52
반응형

인스턴스 속성 attribute_name이 __init__ 외부에 정의되어 있습니다.

클래스 컨스트럭터를 다음과 같이 여러 함수를 호출하여 분할했습니다.

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

내 통역사가 내 코드를 조작하는 동안, 필린트는 불만을 품었다.

Instance attribute attribute_name defined outside __init__

구글 검색은 현재 아무 성과도 없다.모든 생성자 논리 유지__init__정리되지 않은 것 같고, Pylint 경고를 끄는 것도 해킹처럼 보입니다.

이 문제를 해결하는 방법은 무엇입니까?

이 메시지 뒤에 있는 아이디어는 읽기 쉽도록 하기 위한 것입니다.인스턴스가 가지는 모든 Atribute를 읽어내는 것으로, 그 Atribute를 찾아낼 수 있습니다.__init__방법.

다만, 초기화를 다른 방법으로 분할할 수도 있습니다.이 경우 Atribute를 할당하기만 하면 됩니다.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 부분에서 파라미터를 작성한 다음 Def에서 파라미터를 조정하는 것입니다.

class MainApplication(tk.Frame):
    def __init__(self, master):
        self.master = master
        tk.Frame.__init__(self, self.master)
        self.settingsFrame = None
        self.create_widgets(master)

    def create_widgets(self, master):
        # frame Container
        self.settingsFrame = tk.Frame(self.master, width=500, height=30, bg='white')

init 이외의 인스턴스 변수의 정의는 일반적으로 권장되지 않지만 자연스러운 경우가 있습니다.예를 들어 자녀 클래스가 사용하지 않는 여러 변수를 정의하는 부모 클래스가 있고 그 정의로 인해 자녀에게 시간이나 리소스가 낭비되거나 단순히 미각적이지 않을 수 있습니다.

이에 대한 하나의 가능한 해결책은 각 자식 클래스가 덮어쓸 수 있는 init-extension 함수를 사용하는 것입니다.이 함수에서는 클래스 고유의 인스턴스 변수를 정의하기 위해 함수 setatr을 사용합니다.이것도 그다지 심미적인 것은 아닐지도 모르지만, 여기서 설명했던 보풀 경고는 없어집니다.

함수를 통해 설정하는 각 Atribut에 대해 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

Python 3 를 사용하고 있는 경우는,

class Wizard:
    def __init__(self, argv):
        self.name: str = str()
        self.magic_ability: str = str()
        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

비록 받아들여진 대답만큼 비단뱀은 아니지만, 그것은 필린트 경고를 없애줄 것이다.

또한 타입에 대해 신경 쓰지 않고 새로운 오브젝트를 만들고 싶지 않은 경우object() 라이선스:

class Wizard:
    def __init__(self, argv):
        self.name = type(None)()
        # ...

~로Noneerror.type not match error.type not match는 일치하지 않습니다.

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

반응형