A
에 old_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_name
에 old_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 것입니다!
'B' 같은 클래스 B에
new_name
및old_name
을 덮어 쓸 필요 'new_name'을 구현합니다. 또한'warnings'을 사용하여'old_name'이 얼마나 비추천적인지를 표시해야합니다. – jonrsharpe"B"클래스를 변경할 수 없다는 점을 명확히하기 위해 질문을 편집했습니다. 나는이 문제를 분류했을 때 경고를 사용하겠다. 고마워. – Niourf
그런 다음 new_name이 old_name을 가리 키도록 호출을 취소하지 않는 한 수정할 수 없습니다 – jonrsharpe