我有一个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.
任何帮助都会受到很大关注!
答案 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_name
和old_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')