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
ますか?
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
ますか?
私が見たイディオムの1つはself.__dict__.update(locals())
です。メソッドの最初で実行すると、オブジェクトのディクショナリが引数で更新されます(メソッドの最初のローカルは引数だけであるため)。あなたが渡す場合、**kwargs
あなたはすることができますself.__dict__.update(**kwargs)
。
もちろん、これは壊れやすいアプローチです。既存の属性をマスクする引数を誤って渡した場合、不可解なバグにつながる可能性があります。たとえば、クラスに.doSomething()
メソッドがあり、誤ってコンストラクターに渡しdoSomething=1
た場合、そのメソッドをオーバーライドし、後でそのメソッドを呼び出そうとするとエラーが発生します。このため、特定の些細な場合(たとえば、いくつかの属性を保持する「バッグ」として機能することだけを目的とするある種のプロキシオブジェクト)を除いて、これを行わない方がよいでしょう。
はい:
class SomeClass:
def __init__(self, **kwargs):
self.__dict__.update(kwargs)
1つの問題
self.__dict__.update(locals())
それが含まれているということself
ですので、あなたは得るself.self
。self
濾したほうがいいよ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')