如何在__init__之前添加属性到class?
How to add attribute to class before __init__?
问题
我有一个 Python 模块,它在运行时创建许多其他模块的实例。其他模块是通过外部配置文件指定的,该文件还包含每个模块的 __init__
.
的所有 arguments/values
我想向所有新实例添加相同的属性,但我不想向我所有 类 的 __init__
添加新参数。我该怎么做?
我的想法
一个可能的解决方案:在运行中,我可以通过某种方式操纵模块上的 __init__
属性来向 __init__
添加一个新的 arg。然后我可以将我想在所有实例上添加的属性传递给它。
我很确定这违反了 Python 的禅宗。话虽这么说,我很好奇怎么能做到这一点?
您可以遍历 **kwargs
__init__
参数并使用 __setattr__
自动设置任何新传递的参数。
示例:
class Foo:
def __init__(self, **kwargs):
for key in kwargs:
self.__setattr__(key, kwargs[key])
您只需盲目地将这两行加上 **kwargs 参数添加到您的 类,然后:
f = Foo(name="bar")
print(f.name)
输出:
bar
问题
我有一个 Python 模块,它在运行时创建许多其他模块的实例。其他模块是通过外部配置文件指定的,该文件还包含每个模块的 __init__
.
我想向所有新实例添加相同的属性,但我不想向我所有 类 的 __init__
添加新参数。我该怎么做?
我的想法
一个可能的解决方案:在运行中,我可以通过某种方式操纵模块上的 __init__
属性来向 __init__
添加一个新的 arg。然后我可以将我想在所有实例上添加的属性传递给它。
我很确定这违反了 Python 的禅宗。话虽这么说,我很好奇怎么能做到这一点?
您可以遍历 **kwargs
__init__
参数并使用 __setattr__
自动设置任何新传递的参数。
示例:
class Foo:
def __init__(self, **kwargs):
for key in kwargs:
self.__setattr__(key, kwargs[key])
您只需盲目地将这两行加上 **kwargs 参数添加到您的 类,然后:
f = Foo(name="bar")
print(f.name)
输出:
bar