문제
저는 주 클래스가“ God Object ” 인 Python 프로젝트를 진행하고 있습니다. 가 있습니다 너무 많은 속성과 메소드 '빌어 먹을!
수업을 리팩토링하고 싶습니다.
지금까지…
첫 번째 단계에서는 상대적으로 간단한 일을하고 싶습니다. 그러나 가장 간단한 접근 방식을 시도했을 때 일부 테스트와 기존 예제가 중단되었습니다.
기본적으로이 클래스에는 속성 목록이 많이 있습니다. 그러나 속성을 명확하게 살펴보고 “이 5 개의 속성은 관련이 있습니다.이 8 개의 속성도 관련이 있습니다… 나머지는 있습니다.” 라고 생각할 수 있습니다 .
getattr
기본적으로 관련 속성을 dict-like helper 클래스로 그룹화하고 싶었습니다. 나는 __getattr__
직업에 이상적이라고 생각했다 . 그래서 속성을 별도의 클래스로 옮겼고 확실히 __getattr__
마법을 완벽하게 작동했습니다 ...
에서 첫 번째 .
그러나 예제 중 하나를 실행 해 보았습니다. 서브 클래스 예제는 이러한 속성 중 하나를 직접 ( 클래스 레벨에서 ) 설정하려고합니다 . 그러나 속성이 더 이상 부모 클래스에서 "물리적으로"위치하지 않았으므로 속성이 존재하지 않는다는 오류가 발생했습니다.
@특성
그런 다음 @property
데코레이터 에 대해 읽었습니다 . 그러나 나는 그것이 부모 클래스의 속성 일 self.x = blah
때 하고 싶은 서브 클래스에 문제가 있다는 것을 읽었습니다 x
.
원하는
self.whatever
부모의whatever
속성이 클래스 (또는 인스턴스) 자체에 "물리적으로"위치하지 않더라도 모든 클라이언트 코드가 계속 사용 되도록하십시오.- 관련 속성을 dict-like 컨테이너로 그룹화하십시오.
- 메인 클래스에서 코드의 극도의 노이즈를 줄입니다.
예를 들어, 나는 단순히 이것을 바꾸고 싶지 않습니다 .
larry = 2
curly = 'abcd'
moe = self.doh()
이것으로 :
larry = something_else('larry')
curly = something_else('curly')
moe = yet_another_thing.moe()
... 아직 시끄럽기 때문입니다. 그것은 데이터를 관리 할 수있는 무언가에 대한 간단한 속성을 성공적으로 만들지 만, 원본에는 3 개의 변수가 있고, 수정 된 버전에는 여전히 3 개의 변수가 있습니다.
그러나 다음과 같이하면 좋을 것입니다.
stooges = Stooges()
그리고 검색이 self.larry
실패하면 무언가가 있는지 확인 stooges
하고 확인할 수 larry
있습니다. (그러나 서브 클래스가 larry = 'blah'
클래스 레벨에서 시도 할 경우에도 작동해야합니다 .)
요약
- 부모 클래스의 관련 속성 그룹을 다른 모든 데이터를 저장하는 단일 속성으로 바꾸고 싶습니다.
larry = 'blah'
클래스 수준에서 (예를 들어) 사용하는 기존 클라이언트 코드로 작업하고 싶습니다.- 변경된 사항을 알지 못한 채 하위 클래스가 이러한 리팩토링 된 속성을 확장, 재정의 및 수정하도록 계속하고 싶습니다.
이것이 가능한가? 아니면 잘못된 나무를 짖고 있습니까?