私は、インスタンス変数でデフォルト値を持つクラスを持っています。Python:プログラムによるクラスインスタンス変数の初期化with localals()
それはself.x = x
などを何度も書くことは非常に冗長なので、私は、プログラムの変数を初期化します。
例:
# The "painful" way
class A:
def __init__(self, a, b=2, c=3, d=4.5, e=5):
self.a = a
self.b = b
self.c = c
self.d = d
self.e = e
# The "lazy" way
class B:
def __init__(self, a, b=2, c=3, d=4.5, e=5):
self.__dict__.update({k: v for k, v in locals().items() if k!='self'})
# The "better lazy" way suggested
class C:
def __init__(self, a, b=2, c=3, d=4.5, e=5):
for k, v in locals().items():
if k != 'self':
setattr(self, k, v)
x = A(1, c=7)
y = B(1, c=7)
z = C(1, c=7)
print(x.__dict__) # {'d': 4.5, 'c': 7, 'a': 1, 'b': 2, 'e': 5}
print(y.__dict__) # {'d': 4.5, 'c': 7, 'a': 1, 'b': 2, 'e': 5}
print(z.__dict__) # {'d': 4.5, 'c': 7, 'a': 1, 'b': 2, 'e': 5}
そうするために、この例(持つ、簡潔にするために、わずか5インスタンス変数と任意の方法はを省略)を検討、説明するために
私の人生は簡単に、私はA.
はこの悪い習慣れるのと同じ結果が得られたクラスBに示されているイディオムを使いますか?落とし穴がありますか?
補遺: このイディオムを使用するもう1つの理由は、いくつかのスペースを節約するためだった - 私はMicroPythonでそれを使用するためのもの。 何らかの理由で、Because locals work differently thereは、クラスAで示された方法だけがその中で動作します。
はい。それは悪い習慣です。 'dict()'を使わないのはなぜですか?それらはクラス属性でなければなりませんか? –
関連:http://stackoverflow.com/q/1389180/3001761 – jonrsharpe
私は明らかな落とし穴を考えることはできませんが、私はそれがかなり総体であるとわかります。 – wim