3

Google App Engine에 장바구니 앱을 만들고 있습니다. Python : 하위 클래스가 상속 된 메서드를 오버로드 할 수 있습니까?

class BaseHandler(webapp.RequestHandler): 
    def get(self, CSIN=None): 
     self.body(CSIN) 

이 모든 자손 클래스의 body() 방법은 같은 인수를 가질 필요가 있다는 뜻 : 나는 기본이되는 핸들러에서 파생 된 많은 클래스가? 이것은 성 가시다. 오직 한 명의 자손 만이이 인수를 실제로 사용합니다. 그리고 새로운 args를 추가하면 어떨까요? 모든 수업을 끝내야합니까?

class Detail(BaseHandler): 
    def body(self, CSIN): 

class MainPage(BaseHandler): 
    def body(self, CSIN=None): #@UnusedVariable 

class Cart(BaseHandler): 
    def body(self, CSIN): #@UnusedVariable 

답변

6

재정의 된 메소드는 원칙적으로 서로 동일한 매개 변수를 가질 필요는 없지만 호출되는 동일한 형식 매개 변수가 있어야합니다. 따라서 어떤 핸들러도 get에 의해 호출 된 body을 가질 수 있습니다. 그렇습니다. 그렇습니다. 이 점에 대해 우선 순위의 종류는 호출자가 객체의 정확한 클래스를 알지 못하기 때문에 모든 매개 변수가 동일한 매개 변수를 가지지 않으면 일반적으로 호출자는 전달할 항목을 알 수 없습니다. 따라서 다른 매개 변수로 무시하는 것은 이상한 트릭입니다.

그렇다면 args를 변경하면 함수가 일치하도록 변경해야합니다. 이것은 상속과는 아무런 관련이 없습니다. Python 함수가 작동하는 방식입니다.

class Detail(BaseHandler): 
    def body(self, **kwargs): 
     print kwargs['CSIN'] 

class MainPage(BaseHandler): 
    def body(self, **kwargs): # can ignore kwargs 

class Cart(BaseHandler): 
    def body(self, **kwargs): # can ignore kwargs 

class BaseHandler(webapp.RequestHandler): 
    def get(self, CSIN=None): 
     self.body(CSIN = CSIN, some_new_arg = 3) 

class SomeNewHandler(BaseHandler): 
    def body(self, **kwargs): 
     print kwargs['some_new_arg'] 

나는 약간 생각이의 지혜에 의문을 제기 않는 : 당신이 좀 더 유연성을 원하는 경우에

, 당신은 인수로 사전을 전달하는 멋진 방법입니다 키워드 인수를 사용할 수있는 경우 당신은 새로운 매개 변수를 많이 추가하려고합니다. 그리고 대부분의 구현은 대부분의 매개 변수를 무시합니다. 그렇다면 body은 실제로 그러한 인수의 함수가 아닙니다. 어쩌면 실제로 인수는 핸들러 객체의 상태의 일부이므로 매개 변수로 전달됩니다. 분명히 차이점은 다소 주관적입니다. 객체 당 한 번만 호출되는 함수에 대해서는 사전을 전달하는 것과 사전에 self을 사용하는 것 사이에 실용적인 차이가별로 없습니다.

+0

실제로, 아마도 당신이 맞습니다. 어떻게 그 데이터에 액세스 할 수 있습니까? –

+0

get은'body'를 호출하기 전에'self.CSIN = CSIN'과 다른 모든 속성을 사용할 수 있습니다. 핸들러는 필요하다면'self.CSIN'을 ​​읽을 수 있고 그렇지 않은 경우는 읽을 수 없습니다. CSIN이 실제로 전체 요청의 속성 인 경우에만이 작업을 수행합니다. 단,이 * 특정 * 호출의 속성이 아닙니다. CSIN의 값이 다른 동일한 핸들러 객체에서'body'를 두 번 이상 호출 할 수 있다면 핸들러의 속성이 아니라 실제로 함수 매개 변수입니다. 그렇지 않으면 일을 깔끔하게 처리하기 위해 필요한 모든 데이터를 처리기에 저장할 수 있습니다. –

+0

... 또 다른 옵션은 실제로 필요한 것에 따라 BaseHandler가 다른 메소드를 호출하도록하는 것입니다. 때로는 너무 많은 특수한 경우를 하나의 추상화로 밀어 넣으려고 시도했으며 실제로 "본문"은 모든 구체화에서 동일한 목적을 수행하지 못한다는 것을 알고 있습니다. 유일한 차이점은 CSIN이 신체를 렌더링하는 데 필요한 것인지 아닌지 여부가 여기에 해당하지 않을 수도 있습니다.하지만 상황이 나빠지면 결국 끝날 수 있습니다. –

2

파이썬은 이름 기반의 오버로딩을위한 메소드와 일치합니다. 즉,

class Base: 
    def method(self, param2): 
    print "cheeses" 

class NotBase(Base): 
    def method(self): 
    print "dill" 

obj = NotBase(); 
obj.method() 

은 obj.method ("stuff")가 실패하는 동안 딜을 출력합니다.

그러나이 경우 바람직한 행동은 아닙니다. 기본 get 메서드에서 호출 한 것보다 적은 수의 매개 변수로 body 메서드를 오버로드하면 해당 클래스에서 get 메서드를 호출하면 오류가 발생합니다.

+0

"올바른 최선의 종류"- 확실히, 내 "반드시 필요하지는 않다"는 절망적이었고,이 경우에 필요하다는 것을 지적하지 못했습니다 ... –

+0

좋은 수정. 제 답변을 삭제했습니다. –

관련 문제