0

保留上下文的细节以及我为什么关心......

可以这样做吗:

class IsThisOk(object):
    def __init__( self, **kwargs ):
        for k in kwargs:
            setattr( self, k, kwargs[k] )
obj = IsThisOk( apples=2 , oranges=2 )

因为我一直把它当作:

class OptionB(object):
    apples = None
    oranges = None
    """class defaults"""
    def __init__( self, **kwargs ):
        for k in kwargs:
            setattr(self,k,kwargs[k])
b = OptionB( apples=2 , oranges=2 )

=====

编辑 :

我最初在上面有这个,这是我不应该有的......

class OptionA(object):
    """set self.k but with class defaults"""
    apples = None
    oranges = None
    def __init__( self, **kwargs ):
        for k in kwargs:
            self.k = kwargs[k]
a = OptionA( apples=2 , oranges=2 )

这一切都来自我试图优化一些代码。

我还注意到:

    for k in kwargs:
        setattr( self, k, kwargs[k] )

    for k,v in kwargs.iteritems():
        setattr( self, k, v )
4

2 回答 2

5

正如 delnan 评论的那样,既不IsThisOkOptionA不会像您所展示的那样工作。那是因为self.k = kwargs[k]等效于setattr(self, "k", kwargs[k])而不是您在 中使用的所需调用OptionB

另一种解决方案可能是使用标准库namedtuple中模块的类工厂:collections

>>> from collections import namedtuple
>>> OptionC = namedtuple("OptionC", ["apples", "oranges"])
>>> c = OptionC(2, 2) # you can also use keyword arguments, if you wish
>>> print(c)
OptionC(apples=2, oranges=2)

此选项的限制是 OptionC 实例将是不可变的,就像它的 parent class 一样tuplec.apples = 5也就是说,创建实例后您将无法执行此操作。

但是,要回答标题中的问题,不,没有必要在类定义中定义默认变量。事实上,我认为这是气馁。如果您希望类构造函数有可选参数,请在__init__方法定义中为它们提供默认值:

class OptionD:
    def __init__(apples=None, oranges=None):
        self.apples = apples
        self.oranges = oranges
于 2013-02-02T21:42:26.240 回答
-3

编辑正如评论中所述,这几乎是一个不该做的例子。

...
for k in kwargs:
  exec('self.{}={}'.format(k,kwargs[k]))
...
于 2013-02-02T21:31:51.670 回答