Class Pythonic:在类的self.\uu init.\uuuu函数中使用uu dict.\uu
在使用spyder IDE编写新类并使用pylint检查最终结果时,我遇到了错误消息(但代码正常工作,没有错误) 上下文:在构造函数中,我想创建新成员(相当多)。通常,这些都足够少,因此我使用以下编码:Class Pythonic:在类的self.\uu init.\uuuu函数中使用uu dict.\uu,class,python,Class,Python,在使用spyder IDE编写新类并使用pylint检查最终结果时,我遇到了错误消息(但代码正常工作,没有错误) 上下文:在构造函数中,我想创建新成员(相当多)。通常,这些都足够少,因此我使用以下编码: class MyClass(): def __init__(self): self.a = ... self.b = ... 但在许多成员(比如说10个)都设置为相同的初始值(比如说它们都是dict())的情况下,我很想这样做: class MyClas
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_方法:“MyClass”的实例没有“c”成员
但是,代码运行得很好,没有错误,也就是说,我可以毫无问题地访问成员“c”
问题:这是一种正确的编码方法,还是应该避免使用这种方法初始化成员?这确实很好,但我通常建议避免直接使用
\uuu dict\uuu
。例如,如果以后要为对象的属性设置自定义setter,该怎么办
在您的示例中,您可以简单地将for循环中的行替换为以下内容:
setattr(self, _var, dict())
是的,直接更新实例字典是合理的。或者,可以使用setattr更新变量。我在生产代码中看到了这两种方法 使用时,无需直接触摸实例字典:
class MyClass():
def __init__(self):
for var in 'a', 'b', 'c':
setattr(self, var, dict())
<>但是如果您直接更新实例字典,那么有两个可能的改进需要考虑。例如,使用而不是dict更好看。此外,您还可以将该方法与关键字参数一起使用:
class MyClass():
def __init__(self):
vars(self).update(a=dict(), b=dict(), c=dict())
我不确定您想用
MyClass
做什么,但听起来您可能会投资一个collections.defaultdict()
。看见仍然对其他人关于修改self的说法感兴趣。u dict_u,而不是创建一个恰好是字典的实例变量。@Noah谢谢Noah,我不知道defaultdict类。听起来真有趣!我现在看到,我确实为我的代码编写了一些“工具”,它们很可能是在一些编码更好的python模块中创建的(例如,我创建了一个简单的东西,它看起来有点像defaultdict,尽管不那么复杂)。非常感谢。谢谢雷蒙德,你的回答真的很清楚而且很有帮助(至少对我来说)。现在我似乎开始缺少一些Python背景。。。我得翻一本书,或者也要翻一本书:)谢谢,威尔。在这种情况下,此函数似乎确实很方便。我要试试看。