gpt4 book ai didi

python - 映射 obj.method({argument :value}) to obj. argument(value)

转载 作者:太空狗 更新时间:2023-10-30 02:23:17 25 4
gpt4 key购买 nike

我不知道这是否有意义,但是......

我正在尝试将方法动态分配给一个对象。

#translate this
object.key(value)
#into this
object.method({key:value})

在我的例子中更具体地说,我有一个对象(我没有写),我们称它为电机,它有一些通用方法集、状态和其他一些。有些以字典作为参数,有些则以列表作为参数。要更改电机的速度并查看结果,我使用:

motor.set({'move_at':10})
print motor.status('velocity')

电机对象,然后将此请求格式化为 JSON-RPC 字符串,并将其发送到 IO 守护程序。 python 电机对象不关心参数是什么,它只处理 JSON 格式和套接字。字符串 move_at 和 velocity 只是可能有数百个有效参数的两个。

我想做的是:

motor.move_at(10)
print motor.velocity()

我想以一种通用的方式来做,因为我有很多不同的论点我可以通过。我不想做的是:

# create a new function for every possible argument
def move_at(self,x)
return self.set({'move_at':x})
def velocity(self)
return self.status('velocity')
#and a hundred more...

我对此进行了一些搜索,结果表明解决方案在于 lambda 和元编程,这两个主题我一直无法理解。

更新:

根据 user470379 的代码,我想出了以下...

# This is what I have now....
class Motor(object):
def set(self,a_dict):
print "Setting a value", a_dict
def status(self,a_list):
print "requesting the status of", a_list
return 10

# Now to extend it....
class MyMotor(Motor):
def __getattr__(self,name):
def special_fn(*value):
# What we return depends on how many arguments there are.
if len(value) == 0: return self.status((name))
if len(value) == 1: return self.set({name:value[0]})
return special_fn
def __setattr__(self,attr,value): # This is based on some other answers
self.set({attr:value})


x = MyMotor()
x.move_at = 20 # Uses __setattr__
x.move_at(10) # May remove this style from __getattr__ to simplify code.
print x.velocity()

输出:

Setting a value {'move_at': 20}
Setting a value {'move_at': 10}
10

感谢所有帮助过的人!

最佳答案

如何创建自己的 __getattr__对于返回动态创建的函数的类? IIRC,在 __getattr____getattribute__ 之间有一些棘手的情况需要注意,我不记得了,我相信有人会发表评论提醒我:

def __getattr__(self, name):
def set_fn(self, value):
return self.set({name:value})
return set_fn

然后应该发生的是调用一个不存在的属性(即:move_at)将调用__getattr__ 函数并创建一个将被返回的新函数(上面的 set_fn)。该函数的 name 变量将绑定(bind)到传递给 __getattr__name 参数(“move_at” 在这个案件)。然后将使用您传递的参数(在本例中为 10)调用该新函数。

编辑

使用 lambda 的更简洁的版本(未测试):

def __getattr__(self, name):
return lambda value: self.set({name:value})

关于python - 映射 obj.method({argument :value}) to obj. argument(value),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4820341/

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