【发布时间】:2018-06-04 07:49:58
【问题描述】:
我想为 Python 类动态定义一些方法。我google了一会儿,发现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 类上更改了我的原始实现,如下所示(有一个错误,总是将最后一个field 更改为define_method())。 @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)
【问题讨论】:
-
将
setattr(self, "with_" + field, _with_field)更改为setattr(Base, "with_" + field, _with_field) -
@user1767754,超酷!它有效。
-
谁能详细解释一下这个
self,Basetihing?
标签: python metaprogramming setattr