使用从类属性派生的名称动态定义方法?

2024-04-29 20:54:27 发布

您现在位置:Python中文网/ 问答频道 /正文

标题可能不是我试图做的最好的描述,但我不知道该怎么称呼这个。我遇到了各种看似相关的概念,比如“decorators”、“descriptor”和“metaclass”,但我不知道应该进一步研究哪种方法(如果有的话)!你知道吗

给定以下类别:

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')

换句话说,我想用从类(MyGreeter)的属性(animals)派生的名称动态定义方法(dog(),等等)。你知道吗

最好的方法是什么?谢谢!你知道吗


Tags: 方法selfdefwhatclassgreetingparrotup
1条回答
网友
1楼 · 发布于 2024-04-29 20:54:27

一个简单的方法就是实现__getattr__(),例如:

class MyGreeter(AnimalGreeter):
    animals = {'dog', 'parrot'}

    def __getattr__(self, animal):
        if animal in self.animals:
            return self.greet(animal)
        raise AttributeError("'{}' object unknown animal '{}'".format(type(self).__name__, animal))

>>> greeter = MyGreeter("What's up")
>>> greeter.parrot
What's up, parrot!
>>> greeter.cat
...
AttributeError: 'MyGreeter' object unknown animal 'cat'

相关问题 更多 >