gpt4 book ai didi

python - 动态地向类添加属性

转载 作者:行者123 更新时间:2023-11-28 21:54:14 24 4
gpt4 key购买 nike

之前在 Stack Overflow 上有人问过这个问题,但似乎没有一个答案能准确说明我需要做什么。在我的例子中,我希望这些动态添加的属性成为从数据库存储和读取值的快捷方式,所以不幸的是它并不那么容易 as in this answer (其中使用了 lambda 函数)或 this one (其中值存储在字典中):我必须调用该类的其他方法。

这是我的尝试:

import operator

class Foo(object):

def get_value(self, name):
# read and return value from database
return -1

def set_value(self, name, value):
# store value in database
pass

def add_metadata_property(name):
getter = operator.methodcaller('get_value', name)
setter = operator.methodcaller('set_value', name) # gets value at runtime
setattr(Foo, name, property(getter, setter))

add_metadata_property('spam')
f = Foo()
f.spam # works!
f.spam = 2

然而,最后一行引发了:

Traceback (most recent call last):
File "<stdin>", line 27, in <module>
TypeError: methodcaller expected 1 arguments, got 2

关于如何实现这一点有什么想法吗?

最佳答案

我不知道你为什么要在这里使用operator.methodcaller。当您调用 f.spam=2 时,它会调用 setter。setter = operator.methodcaller('set_value', name) 表示 setter(r) = r.set_value(name)。在你的情况下没有意义。

我建议你这样写,使用@classmethod:

class Foo(object):

@classmethod
def get_value(self, name):
# read and return value from database
return -1
@classmethod
def set_value(self, name, value):
# store value in database
pass

def add_metadata_property(name):
setattr(Foo, name, property(Foo.get_value, Foo.set_value))

add_metadata_property('spam')
f = Foo()
f.spam # works!
f.spam = 2

如果对您有帮助,请确认为答案。谢谢!

关于python - 动态地向类添加属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24509737/

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