2017-12-26 26 views
0

Aold_name() 메서드가있는 기본 클래스가 있습니다. 서브 클래스는 첫번째 A.old_name()를 호출하여 A에서 상속 old_name()을 대체하는 데 :Python : 이전 버전과의 호환성을 유지하면서 메서드 이름 바꾸기

class A():                 
    '''Old A class'''              

    def old_name(self):              
     print('foo')              

class B(A):                 
    '''Old Subclass.'''              

    def old_name(self):              
     A.old_name(self)             
     print('bar')              

b = B()                  
b.old_name() # must print 'foo bar', prints 'foo bar' 

지금, 나는 new_nameold_name을 변경하고 싶습니다. 그러나 내 API를 깨고 싶지 않아서 B과 같은 이전 하위 클래스 인new_name()old_name()을 모두 지원하도록하고 싶습니다. 또한 새로운 서브 클래스 (예 : C)가 두 가지 메소드를 모두 지원하기를 원합니다. 즉, new_name()이 호출 되었든 old_name()이 호출 되었든간에 foo bar이 인쇄되어야 함을 의미합니다. B 클래스를 수정할 수 없습니다. 변경할 수있는 클래스는 A입니다.

다음은 내가 생각해 낸 것입니다. 불행히도 B은 으로 직접 호출을 지원하지 않으므로 b.old_name()을 우회합니다.

class A():                 
    '''New A class. Now A has to support new_name AND old_name.'''   

    def old_name(self):              
     self.new_name()              

    def new_name(self):              
     print('foo')              

class B(A):                 
    '''Old Subclass, still using old_name'''        

    def old_name(self):              
     A.old_name(self)             
     print('bar')              

class C(A):                 
    '''New Subclass, now using new_name'''         

    def new_name(self):              
     A.new_name(self)              
     print('bar')               


b = B()                  
b.new_name() # must print 'foo bar', only prints 'foo'. Bad.      
b.old_name() # must print 'foo bar', prints 'foo bar'. OK.      

c = C()                  
c.new_name() # must print 'foo bar', prints 'foo bar'. OK.      
c.old_name() # must print 'foo bar', prints 'foo bar'. OK. 

어떤 도움이 크게 appriciated 것입니다!

+0

'B' 같은 클래스 Bnew_nameold_name을 덮어 쓸 필요 'new_name'을 구현합니다. 또한'warnings'을 사용하여'old_name'이 얼마나 비추천적인지를 표시해야합니다. – jonrsharpe

+0

"B"클래스를 변경할 수 없다는 점을 명확히하기 위해 질문을 편집했습니다. 나는이 문제를 분류했을 때 경고를 사용하겠다. 고마워. – Niourf

+0

그런 다음 new_name이 old_name을 가리 키도록 호출을 취소하지 않는 한 수정할 수 없습니다 – jonrsharpe

답변

0

당신은 b.new_name()에서 foo bar를 인쇄하기 위해이

class A(object):                 
    '''New A class. Now A has to support new_name AND old_name.'''   

    def old_name(self):              
     self.new_name()              

    def new_name(self):              
     print('foo')              


class B(A):                 
    '''Old Subclass, still using old_name'''        

    def old_name(self):              
     # A.old_name(self)             
     super(B, self).old_name()             
     print('bar')              


class C(A):                 
    '''New Subclass, now using new_name'''         

    def new_name(self):              
     super(C, self).new_name()              
     print('bar')               


b = B()                  

b.new_name() # must print 'foo bar', only prints 'foo'. Bad.      

b.old_name() # must print 'foo bar', prints 'foo bar'. OK.      

c = C()                  

c.new_name() # must print 'foo bar', prints 'foo bar'. OK.      

c.old_name() # must print 'foo bar', prints 'foo bar'. OK. 

을 좋아한다, 당신은 단지 것이

class B(A):                 
    '''Old Subclass, still using old_name'''        

    def new_name(self):              
     # A.new_name(self)             
     super(B, self).new_name()             
     print('bar') 

    def old_name(self):              
     # A.old_name(self)             
     super(B, self).old_name()             
     # print('bar')              
+0

"B"클래스를 변경할 수 없다는 점을 명확히하기 위해 질문을 편집했습니다. – Niourf

+0

'''class B'''를 바꿀 수없는 이유는 무엇입니까? –

+0

이것은 API의 일부이므로 많은 사용자가 이미 자체 클래스 'B'를 구현했습니다. – Niourf