Python:在保持向后兼容性的同时重命名方法

时间:2017-12-26 10:43:03

标签: python inheritance rename

我有一个A方法的基类old_name()。用于从A继承并通过首先调用old_name()覆盖A.old_name()的子类:

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'

现在,我想将old_name更改为new_name。但是,我不想破坏我的API,因此我仍然希望子类(如B)支持对new_name()old_name()的调用。我还想要新的子类(如C)来支持这两种方法。这样,我的意思是它必须打印foo bar是否调用new_name()或调用old_name()。我无法修改课程B:我唯一能改变的是课程A

这是我想出的。很遗憾,B不支持直接调用new_name(),因为它会绕过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.

任何帮助都会受到很大关注!

1 个答案:

答案 0 :(得分:0)

你应该喜欢这个

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.

要从foo bar打印b.new_name(),您需要覆盖 B类中的new_nameold_name

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')