gpt4 book ai didi

python - Python 中的 define_method

转载 作者:太空宇宙 更新时间:2023-11-04 02:24:49 24 4
gpt4 key购买 nike

我想为 Python 类动态定义一些方法。我用谷歌搜索了一会儿,找到了 this .我稍微更改了代码以满足我的要求。

这是我的代码:

class Base(object):

def add_method(self, field):
def func(self, value):
self.colors[field] = value
return self
return func

def define_method(self, *fields):
for field in fields:
setattr(self, "with_" + field, self.add_method(field))


class MyColor(Base):

def __init__(self):
self.colors = {
"black": "000",
"red": "f00",
"green": "0f0"
}

# ========== ==========
# by doing this, I assume `with_red()` and `with_green()`
# will be generated, and they're chain-able.
super(MyColor, self).define_method("red", "green")


s = MyColor()
s.with_red("111").with_green("222")
print(s.colors)
# should output: {"black": "000", "red": "111", "green": 222}

代码会引发错误:

Traceback (most recent call last):
File "main.py", line 26, in <module>
s.with_red("111").with_green("222")
TypeError: _with_field() missing 1 required positional argument: 'value'

怎么了?

感谢您的宝贵时间!

==========编辑==========

抱歉,我更改了我在 Base 类上的原始实现,如下所示(有一个错误,它总是更改传递给 define_method 的最后一个 field( ))。 @Alex 的回答是正确的。

class Base:

def define_method(self, *fields):
for field in fields:
def _with_field(self, value):
self.colors[field] = value
return self
setattr(self, "with_" + field, _with_field)

最佳答案

发生的事情是你设置了例如MyColor 实例上的 'with_red' 属性到 Base 构造函数中定义的局部函数 - 请注意,这不是类方法,只是一个函数,它需要 2 个参数:'self”和“”:

import inspect
...
s = MyColor()
print(inspect.getargspec(s.with_red))

ArgSpec(args=['self', 'value'], varargs=None, keywords=None, defaults=None)

一个简单的解决方法是让这个函数接受一个参数:

def _with_field(value):
self.colors[field] = value
return self

通过此更改,您的代码会产生预期的输出。

另一种选择是在类上设置“with_red”属性 - 这使其成为一个方法,然后隐式传递 self 并且您可以使用两个参数保留 _with_field 签名.

关于python - Python 中的 define_method,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50675730/

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