【发布时间】:2020-03-16 09:00:54
【问题描述】:
我有一个类,我希望能够存储在创建该类或任何子类的新实例时给出的参数的名称和值(子类 init 具有比超类更多的参数)。
def init_store(init):
@wraps(init)
def wrapper(*args, **kwargs):
self = args[0]
fields = args[1:]
field_dict = {arg_name: arg_val for arg_name, arg_val in zip(init.__code__.co_varnames[1:], fields)}
self.init_values = dict(**field_dict, **kwargs)
self.init_values['Problem'] = type(self).__name__
init(*args, **kwargs)
return wrapper
目前我用这个函数装饰我所有子类的初始化,这就是工作。 但是有没有办法在不必装饰每个 init 的情况下获得相同的效果? 环顾四周,我发现元类做了一些类似的事情,但我从未使用过它们,也找不到在此处应用它们的方法。
提前致谢!
【问题讨论】:
-
如果您将类设计为仅使用关键字参数,这似乎会简单得多;那么您只需要子类将所有参数传递给
super().__init__,而您的基类__init__可以简单地保存**kwargs,而无需装饰任何方法。 -
是的,这种方式效果很好,但我更喜欢不必改变我的课程而只学习 kwargs
-
为什么?如果您不必考虑将参数传递给各种方法的顺序,
super更容易正确使用。 -
主类只有一个,但每个子类可能会引入冲突的位置参数。关键字参数标识自己,不依赖于它们的传递顺序。
-
@vjjhgj 查看我的编辑。
标签: python python-3.x class python-decorators