Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Class Pythonic:在类的self.\uu init.\uuuu函数中使用uu dict.\uu_Class_Python - Fatal编程技术网

Class Pythonic:在类的self.\uu init.\uuuu函数中使用uu dict.\uu

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

在使用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_方法:“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背景。。。我得翻一本书,或者也要翻一本书:)谢谢,威尔。在这种情况下,此函数似乎确实很方便。我要试试看。