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