我有一个类与许多实例变量与默认值,可以选择可以在实例化(注意:没有可变的默认参数)重写。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