首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在python中通过变量参数(kwargs)设置类属性

如何在python中通过变量参数(kwargs)设置类属性
EN

Stack Overflow用户
提问于 2011-11-19 02:18:25
回答 10查看 112.4K关注 0票数 150

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

我可以手动设置它们,但似乎变量参数在python中很常见,因此应该有一个通用的习惯用法来实现这一点。但我不确定如何动态地做到这一点。

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

代码语言:javascript
复制
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])
EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2011-11-19 02:39:58

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

代码语言:javascript
复制
class Bar(object):
    def __init__(self, **kwargs):
        self.__dict__.update(kwargs)

然后,您可以:

代码语言:javascript
复制
>>> bar = Bar(a=1, b=2)
>>> bar.a
1

还有类似这样的东西:

代码语言:javascript
复制
allowed_keys = {'a', 'b', 'c'}
self.__dict__.update((k, v) for k, v in kwargs.items() if k in allowed_keys)

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

票数 203
EN

Stack Overflow用户

发布于 2011-11-19 02:27:05

您可以使用setattr()方法:

代码语言:javascript
复制
class Foo:
  def setAllWithKwArgs(self, **kwargs):
    for key, value in kwargs.items():
      setattr(self, key, value)

有一个类似的getattr()方法用于检索属性。

票数 169
EN

Stack Overflow用户

发布于 2016-11-16 20:12:02

这里的大多数答案都没有涵盖将所有允许的属性初始化为一个默认值的好方法。因此,除了@fqxp@mmj给出的答案之外,

代码语言:javascript
复制
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)
票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8187082

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档