Pythonic:在类的函数self .__ init__中使用__dict__

mha*_*vel 14 python class

在使用spyder IDE 编写新类并使用pylint检查最终结果时,我遇到了错误消息(但代码按预期工作而没有错误).

上下文:在构造函数中,我想创建新成员(非常多).通常,这些很少,所以我使用这个编码:

class MyClass():
    def __init__(self):
        self.a = ...
        self.b = ...
Run Code Online (Sandbox Code Playgroud)

但是在很多成员的情况下(假设是10),所有设置为相同的初始值(假设它们都是dict()),我很想这样做:

class MyClass():
    def __init__(self):
        _vars = ["a", "b", "c", ...]
        for _var in _vars:
            self.__dict__[_var] = dict()
Run Code Online (Sandbox Code Playgroud)

在课堂上,我正在使用以下成员来引用成员:

class MyClass():
    def my_method(self):
        print self.c
Run Code Online (Sandbox Code Playgroud)

错误pylint的(在Spyder的):

在此文件上使用pylint时,我收到一条错误消息:

MyClass.my_method:'MyClass'的实例没有'c'member.

但是,代码运行得很好,没有错误,即.我可以毫无问题地访问会员'c'.

问题:这是一个正确的编码,还是应该避免这种方法来初始化成员?

Ray*_*ger 19

是的,直接更新实例字典是合理的.或者,您可以使用setattr更新变量.我已经看到了生产代码中使用的两种方法.

使用setattr,无需直接触摸实例字典:

class MyClass():
    def __init__(self):
        for var in 'a', 'b', 'c':
            setattr(self, var, dict())
Run Code Online (Sandbox Code Playgroud)

但是,如果直接更新实例字典,可以考虑几种可能的改进.例如,使用vars()而不是__dict__看起来有点好看.此外,您可以将dict.update方法与关键字参数一起使用:

class MyClass():
    def __init__(self):
        vars(self).update(a=dict(), b=dict(), c=dict())
Run Code Online (Sandbox Code Playgroud)


Wil*_*ill 5

它确实很好,但我通常建议避免__dict__直接搞乱.例如,如果您希望稍后为您的对象的属性设置自定义setter,该怎么办?

在您的示例中,您只需使用以下内容替换for循环中的行:

setattr(self, _var, dict())
Run Code Online (Sandbox Code Playgroud)