标题可能不是我想要做的最好的描述,但我不知道该怎么称呼它。我遇到了各种看起来相关的概念,名称分别是“装饰器”,“描述符”和“元类”,但我不知道我应该进一步调查哪些方法(如果有的话)。动态定义派生自类属性名称的方法?
考虑以下类:
class AnimalGreeter(object):
def __init__(self, greeting):
self.greeting = greeting
def greet(self, animal):
print(self.greeting + ", " + animal + "!")
class MyGreeter(AnimalGreeter):
animals = ['dog', 'parrot']
我希望能够使用的MyGreeter
一个实例是这样的:
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')
In换句话说,我想动态定义从类(MyGreeter
)的属性(animals
)派生的名称的方法(dog()
等)。
这样做的最好方法是什么?非常感谢!
只实现'__getattr __(自我,动物)'。 – AChampion
不能帮助,但我对你的用例感兴趣。你为什么需要这种行为? – FabienP
@FabienP,在我的案例中'AnimalGreeter'是一个Django模型,'MyGreeter'是一个自定义混合,它可以处理具有可配置文件名的图像。我想要访问Django模板中的图像url,但Django的模板系统不允许将实例方法传递给参数。所以我不能在模板中做相当于'model.image_url('large')'。但是我可以访问模板中的实例属性,例如'model.large_image_url'。 – tino