私はインスタンス化できない基底クラスを持っています(私の簡略化した例ではBaseFruit
)、同じメソッドを共有するいくつかの派生クラス(例えばApple
) (printfuture
)。しかしながら、それらは多くの可能な変形であり、どのような変形が使用されるべきかをユーザに選択させたい(例えば、sadfuture
およびsaddestfuture
)。Pythonのメタベースクラスにユーザーが選択したメソッドを追加
私のprintfuture
メソッドは私の派生クラスすべてに共通しているので、私は基本クラスの__new__
メソッドを使ってバリアントのユーザー引数をキャッチし、そのメソッドを基本クラス自体に割り当てることに充当されると考えました。
# 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