python - 如何在 python 中从变量参数(kwargs)设置类属性

假设我有一个带有构造函数(或其他函数)的类,它接受可变数量的参数,然后有条件地将它们设置为类属性。

我可以手动设置它们,但似乎可变参数在 python 中很常见,应该有一个通用的习惯用法。但我不确定如何动态执行此操作。

我有一个使用 eval 的示例,但这并不安全。我想知道正确的方法——也许用 lambda?

class Foo:
    def setAllManually(self, a=None, b=None, c=None):
        if a!=None: 
            self.a = a
        if b!=None:
            self.b = b
        if c!=None:
            self.c = c
    def setAllWithEval(self, **kwargs):
        for key in **kwargs:
            if kwargs[param] != None
                eval("self." + key + "=" + kwargs[param])

最佳答案

您可以使用关键字参数更新 __dict__ 属性(以字典的形式表示实例属性):

class Bar(object):
    def __init__(self, **kwargs):
        self.__dict__.update(kwargs)

那么你可以:

>>> bar = Bar(a=1, b=2)
>>> bar.a
1

还有类似的东西:

allowed_keys = {'a', 'b', 'c'}
self.__dict__.update((k, v) for k, v in kwargs.items() if k in allowed_keys)

您可以预先过滤键(如果您仍在使用 Python 2.x,请使用 iteritems 而不是 items)。

https://stackoverflow.com/questions/8187082/

相关文章:

python - 来自 os.listdir() 的非字母数字列表顺序

python - 在 CentOS 中安装 python 2.6

python - 为什么循环导入似乎在调用堆栈中更靠前,但在更靠下的位置引发 ImportError

python - 对带有异常的字符串进行标题化

python - 如何检查文件是否是有效的图像文件?

python - 如何绘制正态分布

python - 非 ASCII 字符的语法错误

python - SQLAlchemy ORM 转换为 pandas DataFrame

python - “模块”没有属性 'urlencode'

python - 如何删除字符串中的前导零和尾随零? Python