5

多くの場合、クラスのコンストラクターはその引数を取り、インスタンスに保存します。例えば:

class Example(object):
    def __init__(self, title='',backtitle='', height=20, width=50):
        self.title = title
        self.backtitle = backtitle
        self.height = height
        self.width = width

これは繰り返しなので、これを自動的に行うヘルパー関数を作成しました。

from inspect import getargspec
def save_args(values):
    for i in getargspec(values['self'].__init__).args[1:]:
        values['self'].__dict__[i] = values[i]

class Example(object):
    def __init__(self, title='',backtitle='', height=20, width=50):
        save_args(vars())

私の質問は次のとおりです。

  • これは特定のクラスまたは引数で失敗しますか
  • 移植可能ですか、Jythonなどで動作しますか..Python 2.7および3.2で動作しました
  • より簡単な代替手段はありますか?
  • すでにこれを行っているpythonパッケージはありますか?
4

2 に答える 2

6

クラスが を使用すると失敗します__slots__。代わりに使用できますsetattr()

from inspect import getargspec
def save_args(values):
    for i in getargspec(values['self'].__init__).args[1:]:
        setattr(values['self'], i, values[i])

もちろん、argumentsキーワード引数__init__がすべて宣言されたスロットである場合。

それ以外の場合、これはどの Python 実装でも機能するはずです。

このトピックの以前の議論に興味があるかもしれませ.

于 2013-03-18T18:27:48.447 に答える
1

これには、より多くのコードを記述し、Exampleコンストラクターへのすべての誤った引数を黙って無視し、Exampleコンストラクターへの位置引数をサポートしないが、inspect:の使用を回避する必要があります。

def save_args(obj, defaults, kwargs):
    for k,v in defaults.iteritems():
        if k in kwargs: v = kwargs[k]
        setattr(obj, k, v)

class Example(object):
    def __init__(self, **kwargs):
        defaults = { 'title': '',
                     'backtitle': '',
                     'height': 20,
                     'width': 50 }
        save_args(self, defaults, kwargs)
于 2013-03-18T18:35:31.863 に答える