为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

MMTTMM 2019-11-11 13:10:22
假设我有一个带有构造函数(或其他函数)的类,该类接受可变数量的参数,然后有条件地将其设置为类属性。我可以手动设置它们,但似乎变量参数在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])
查看完整描述

3 回答

?
蓝山帝景

TA贡献1843条经验 获得超7个赞

您可以__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)。


查看完整回答
反对 回复 2019-11-11
?
白板的微信

TA贡献1883条经验 获得超3个赞

您可以使用以下setattr()方法:


class Foo:

  def setAllWithKwArgs(self, **kwargs):

    for key, value in kwargs.items():

      setattr(self, key, value)

有一种类似的getattr()方法来检索属性。


查看完整回答
反对 回复 2019-11-11
?
繁星点点滴滴

TA贡献1803条经验 获得超3个赞

我提出了fqxp答案的一种变体,除了允许的属性外,还可以让您设置属性的默认值:


class Foo():

    def __init__(self, **kwargs):

        # define default attributes

        default_attr = dict(a=0, b=None, c=True)

        # define (additional) allowed attributes with no default value

        more_allowed_attr = ['d','e','f']

        allowed_attr = list(default_attr.keys()) + more_allowed_attr

        default_attr.update(kwargs)

        self.__dict__.update((k,v) for k,v in default_attr.items() if k in allowed_attr)

这是Python 3.x代码,对于Python 2.x,您需要至少进行一次调整,iteritems()以代替items()。


查看完整回答
反对 回复 2019-11-11
  • 3 回答
  • 0 关注
  • 1201 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信