Я хотел бы динамически определить некоторые методы для класса Python.Некоторое время я гуглил и нашел это .Я немного изменил код, чтобы выполнить мое требование.
Вот мои коды:
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()
).@ Алекс отвечает.
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)