使用 spyder IDE编写新类,并使用 pylint 检查最终结果时,我遇到了错误消息(但代码按预期工作没有错误)。
上下文:在构造函数中,我想创建新成员(非常多)。通常,这些很少,所以我使用这个编码:
class MyClass():
def __init__(self):
self.a = ...
self.b = ...
但是在很多成员的情况下(比方说10),所有设置为相同的初始值(假设它们都是dict()),我很想这样做:
class MyClass():
def __init__(self):
_vars = ["a", "b", "c", ...]
for _var in _vars:
self.__dict__[_var] = dict()
在课堂上,我正在使用以下内容来引用会员:
class MyClass():
def my_method(self):
print self.c
使用 pylint <在 spyder 中错误:
在此文件上使用pylint时,我收到一条错误消息:
MyClass.my_method:'MyClass'的实例没有'c'member。
然而,代码运行得很好,没有错误,即。我可以毫无问题地访问会员'c'。
问题:这是一个正确的编码,还是应该避免这种方法来初始化成员?
答案 0 :(得分:19)
是的,直接更新实例字典是合理的。或者,您可以使用 setattr 更新变量。我已经看到了生产代码中使用的两种方法。
使用setattr,无需直接触摸实例字典:
class MyClass():
def __init__(self):
for var in 'a', 'b', 'c':
setattr(self, var, dict())
但是如果直接更新实例字典,可以考虑几种可能的改进。例如,使用vars()代替 __ dict __ 看起来有点好看。此外,您可以使用dict.update方法和关键字参数:
class MyClass():
def __init__(self):
vars(self).update(a=dict(), b=dict(), c=dict())
答案 1 :(得分:5)
确实很好,但我通常建议避免直接弄乱__dict__
。例如,如果您希望稍后为您的对象的属性设置自定义setter,该怎么办?
在您的示例中,您只需使用以下内容替换for循环中的行:
setattr(self, _var, dict())