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

デルナンがコメントしたように、どちらもIsThisOkあなたOptionAが示したように機能しません。これは、 で使用する目的の呼び出しではなく、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 インスタンスが親クラスのように不変になることtupleです。c.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 に答える