我有一個類與許多實例變量與默認值,可以選擇可以在實例化(注意:沒有可變的默認參數)重寫。Python:程序類實例變量初始化與本地人()
因爲編寫self.x = x
等很多次都是相當多餘的,所以我以編程方式初始化變量。
爲了說明,考慮本實施例中(其具有,爲了簡潔起見,僅5中省略實例變量和任何方法):
實施例:
# 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}
因此,爲了使我的生活更容易,我使用B類中所示的成語,其結果與A相同。
這是不好的做法嗎?有沒有什麼陷阱?
附錄: 另一個理由使用這個成語是爲了節省一些空間 - 我打算MicroPython使用它。 無論出於何種原因Because locals work differently there,只有類A中顯示的方式工作。
是的。這是不好的做法。爲什麼不使用'dict()'?他們必須是班級屬性嗎? –
相關:http://stackoverflow.com/q/1389180/3001761。 – jonrsharpe
我想不出任何明顯的缺陷,但我確實發現它很糟糕。 – wim