인스턴스화 할 수없는 기본 클래스 (내 단순화 된 예제에서는 BaseFruit
)와 동일한 메소드를 공유해야하는 몇 가지 파생 클래스 (예 : Apple
예) (printfuture
). 그러나 여러 가지 변형이 가능하므로 어떤 변형을 사용해야하는지 사용자가 선택하도록하십시오 (예 : sadfuture
및 saddestfuture
).python의 메타 기본 클래스에 사용자가 선택한 메소드 추가
내 printfuture
메서드는 내 모든 파생 클래스에 공통적 인 것으로, 나는 기본 클래스의 __new__
메서드를 사용하여 변형에 대한 사용자 인수를 catch하고 해당 메서드를 기본 클래스 자체에 할당하는 것이 적절하다고 생각했습니다.
# my custom methods
def sadfuture(self):
"""A sad future"""
print 'It looks {}!'.format(self.aspect)
print 'Mmm yummy !'
def saddestfuture(self):
"""A saddest future"""
print 'It looks {}'.format(self.aspect)
print 'Garbage !'
# my base class
class BaseFruit(object):
"""Fruit base class"""
def __new__(cls, *args, **kwargs):
setattr(cls, 'printfuture', kwargs['usermethod'])
return object.__new__(cls)
# My class
class Apple(BaseFruit):
"""An apple class"""
def __init__(self, aspect, usermethod=sadfuture):
self.aspect = aspect
if __name__ == '__main__':
goodapple = Apple(aspect='delicious', usermethod=sadfuture)
goodapple.printfuture() # ==> ok
badapple = Apple(aspect='rotten', usermethod=saddestfuture)
goodapple.printfuture() # ==> not ok anymore
badapple.printfuture() # ==> ok
인쇄 :
It looks delicious!
Mmm yummy !
It looks delicious!
Mmm yummy !
It looks rotten
Garbage !
내가 내 기본 클래스와 첫 덮어 것을 이해한다 : 대신 예상되는 동작의
It looks delicious!
Mmm yummy !
It looks delicious
Garbage !
It looks rotten
Garbage !
을 아래의 예에서 작성된 객체가 동작을 변경했습니다. 그래서, 내 주요 질문은 : 기본 클래스에서 내 사용자 지정 메서드를 유지하면서 예상 된 동작을 어떻게 얻을 수 있습니까?
모범 사례에 대한 의견 및 이러한 문제에 대한 적절한 디자인에 대한 의견도 환영합니다.
** 알려주십시오 ** 예상되는 동작은 무엇입니까? ** – monamona
@monamona done! – Delforge
나는 문제가 무엇인지에 대해 강한 의구심을 갖고 있지만 답변을 입력하는 데 잠시 시간이 걸릴 것입니다. – monamona