7

Python のコンストラクタは、多くの場合、次のようになります。

class SomeClass:
    def __init__(self, a, b = None, c = defC):
        self.a = a
        self.b = b or []
        self.c = c

たとえば、単に__init__(self,**kwargs)キーを のプロパティとして定義して使用するなど、ショートカットはありselfますか?

4

3 に答える 3

9

私が見たイディオムの1つはself.__dict__.update(locals())です。メソッドの最初で実行すると、オブジェクトのディクショナリが引数で更新されます(メソッドの最初のローカルは引数だけであるため)。あなたが渡す場合、**kwargsあなたはすることができますself.__dict__.update(**kwargs)

もちろん、これは壊れやすいアプローチです。既存の属性をマスクする引数を誤って渡した場合、不可解なバグにつながる可能性があります。たとえば、クラスに.doSomething()メソッドがあり、誤ってコンストラクターに渡しdoSomething=1た場合、そのメソッドをオーバーライドし、後でそのメソッドを呼び出そうとするとエラーが発生します。このため、特定の些細な場合(たとえば、いくつかの属性を保持する「バッグ」として機能することだけを目的とするある種のプロキシオブジェクト)を除いて、これを行わない方がよいでしょう。

于 2012-08-30T06:33:33.477 に答える
6

はい:

class SomeClass:
    def __init__(self, **kwargs):
        self.__dict__.update(kwargs)
于 2012-08-30T06:31:10.200 に答える
6

1つの問題

self.__dict__.update(locals())

それが含まれているということselfですので、あなたは得るself.selfself濾したほうがいいよlocals()

例えば。

vars(self).update((k,v) for k,v in vars().items() if k != 'self')

このバリエーションを使用すると、誤ってメソッドを上書きすることを防ぐことができます

vars(self).update((k,v) for k,v in vars().items()
                   if k != 'self' and k not in vars(self))

黙って失敗したくない場合は、このように事前に確認することもできます

if any(k in vars(self) for k in vars()):
    raise blahblah
vars(self).update((k,v) for k,v in vars().items() if k != 'self')
于 2012-08-30T06:38:32.660 に答える