タイトルは私がやろうとしていることの最善の説明ではないかもしれませんが、私はこれを何と呼ぶべきか分かりません。私は、 "デコレータ"、 "記述子"、 "メタクラス"のような名前を持つ様々な一見関連した概念に出くわしましたが、私はこれらのアプローチ(もしあれば)をさらに調査しなければなりません!私はこのようなMyGreeter
のインスタンスを使用できるようにしたいと思いクラス属性から派生した名前を持つメソッドを動的に定義していますか?
class AnimalGreeter(object):
def __init__(self, greeting):
self.greeting = greeting
def greet(self, animal):
print(self.greeting + ", " + animal + "!")
class MyGreeter(AnimalGreeter):
animals = ['dog', 'parrot']
:効果的
greeter = MyGreeter("What's up")
greeter.parrot
# "What's up, parrot!"
、私はそれが私かのように機能したいと思います
は、以下のクラスを考えます代わりにMyGreeter
を次のように定義しました:
class MyGreeter(AnimalGreeter):
@property
def dog(self):
self.greet('dog')
@property
def parrot(self):
self.greet('parrot')
言い換えれば、クラス(MyGreeter
)の属性(animals
)から派生した名前を持つメソッド(dog()
など)を動的に定義したいと思います。
これを行うにはどのような方法が最適ですか?どうもありがとう!
ただ、 '' __getattr __(自己、動物)を実装。 – AChampion
ここでは手伝っていますが、私はあなたのユースケースに興味があります。なぜあなたはこの振る舞いを必要としますか? – FabienP
@FabienP、私のケースでは 'AnimalGreeter'はDjangoモデルで、' MyGreeter'は設定可能なファイル名で画像を扱うカスタムミックスインです。私はDjangoのテンプレートの画像URLにアクセスしたいが、Djangoのテンプレートシステムでは引数をインスタンスメソッドに渡すことはできません。ですから、私はテンプレートの 'model.image_url( 'large')'と同等のことをすることはできません。しかし、私は 'model.large_image_url'のようなテンプレートのインスタンスプロパティにアクセスできます。 – tino