1

내가 어떤 방법으로 Base 클래스를 가지고 w 매개 변수/O를 시그니처 매개 변수 x.불일치는

class A(Base): 

    def pretty_method(self, x): 
     super().pretty_method() 
     print('X in A is {}'.format(x)) 

class B(Base): 

    def pretty_method(self, x): 
     super().pretty_method() 
     print('X in B is {}'.format(x)) 

그래서이 경우에는 클래스 메소드 서명이 일치하지 않습니다.

반면에 나는 기본 클래스에서 사용되지 않는 x 매개 변수를 처리 할 수 ​​: 좀 쓸모가 없지만, 일관성에 서명을 유지

class Base(): 

    def pretty_method(self, x=None): 
     print('Hi!') 

합니다. 더 바람직한 접근 방법은 무엇입니까?

+2

이 경우 일관성을 유지할 필요가 없습니다. 이 메서드를 재정의하여 기본 클래스의 메서드와 동일한 서명을 사용해야하는 이유는 무엇입니까? – Kasramvd

답변

1

파생 클래스에서 새 특성/메서드를 추가해도 문제가되지 않으므로이를 제거하는 것은 Liskov substitution principle을 위반하기 때문이 아닙니다.

고려 : (현대) Python의 모든 클래스는 object에서 파생되며 새로운 속성 &/또는 메소드를 추가하지 않으면 쓸모가 없습니다. 파생 클래스의 __init__ 메서드에 새 args를 추가하는 것은 완전히 정상입니다.

물론 파생 클래스의 대부분이 x 인수를 사용할 것으로 예상되는 경우 기본 클래스 자체에서 사용하지 않는 경우에도 기본 클래스에도 추가하는 것이 좋습니다.

관련된 참고 사항에서 기본 클래스 자체에 사용하지 않지만 파생 클래스가 재정의 할 것으로 예상되는 메서드를 기본 클래스에 추가하는 것이 일반적입니다. 이 경우 기본 방법이 NotImplemented 인 경우 정상입니다. 에 기본 클래스에서 그러한 메소드를 제공하려면이 필요하지 않지만 누군가가 파생 클래스에서 메소드를 제공하는 것을 잊어 버린 경우 오류 메시지를보다 유익하게 만듭니다.