gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 14:50:23 25 4
gpt4 key购买 nike

标题可能不是对我正在尝试做的事情的最好描述,但我不确定如何调用它。我遇到了各种看似相关的概念,例如“装饰器”、“描述符”和“元类”,但我不知道我应该进一步研究这些方法中的哪一种(如果有的话)!

给定以下类:

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

换句话说,我想动态定义方法(dog() 等),其名称派生自类 ( 的属性 (animals) >MyGreeter).

最好的方法是什么?非常感谢!

最佳答案

一个简单的方法就是实现 __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'

关于python - 使用派生自类属性的名称动态定义方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46201887/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com