如何通过可变参数(kwargs)设置Python中的类属性

176 投票
13 回答
149939 浏览
提问于 2025-04-17 06:36

假设我有一个类,这个类里面有一个构造函数(或者其他函数),它可以接收不定数量的参数,然后根据条件把这些参数设置为类的属性。

我可以手动设置这些属性,但在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])

13 个回答

20

这里大部分的回答没有提到一个好的方法来把所有允许的属性初始化为一个默认值。所以,我想补充一下@fqxp@mmj给出的答案:

class Myclass:

    def __init__(self, **kwargs):
        # all those keys will be initialized as class attributes
        allowed_keys = set(['attr1','attr2','attr3'])
        # initialize all allowed keys to false
        self.__dict__.update((key, False) for key in allowed_keys)
        # and update the given keys by their given values
        self.__dict__.update((key, value) for key, value in kwargs.items() if key in allowed_keys)
183

你可以使用 setattr() 这个方法来设置属性:

class Foo:
  def setAllWithKwArgs(self, **kwargs):
    for key, value in kwargs.items():
      setattr(self, key, value)

还有一个类似的 getattr() 方法,用来获取属性。

237

你可以用关键字参数来更新 __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)。

撰写回答