인스턴스 속성 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)()
# ...
~로None
error.type not match error.type not match는 일치하지 않습니다.
언급URL : https://stackoverflow.com/questions/19284857/instance-attribute-attribute-name-defined-outside-init
'programing' 카테고리의 다른 글
장고 개발 IDE (0) | 2022.10.18 |
---|---|
2개의 데이터센터 간의 Galera 클러스터 리플리케이션 (0) | 2022.10.18 |
main.c 파일을 삭제하면 이 프로젝트를 빌드할 수 없는 이유는 무엇입니까? (0) | 2022.10.18 |
HTML 파일 경로 위치에서 "./"(도트 슬래시)는 무엇을 의미합니까? (0) | 2022.10.18 |
변수의 메모리 공간(크기)을 판별하는 방법 (0) | 2022.10.18 |