class,dict,self,init,args?

kam*_*ame 11 python arguments class self

class attrdict(dict):
    def __init__(self, *args, **kwargs):
        dict.__init__(self, *args, **kwargs)
        self.__dict__ = self

a = attrdict(x=1, y=2)
print a.x, a.y

b = attrdict()
b.x, b.y  = 1, 2
print b.x, b.y
Run Code Online (Sandbox Code Playgroud)

有人可以用文字解释前四行吗?我读到了类和方法.但这里看起来很混乱.

Jos*_*ron 7

我的逐行解释:

class attrdict(dict):
Run Code Online (Sandbox Code Playgroud)

这一行声明了一个类attrdict作为内置dict类的子类.

def __init__(self, *args, **kwargs): 
    dict.__init__(self, *args, **kwargs)
Run Code Online (Sandbox Code Playgroud)

这是您的标准__init__方法.调用dict.__init__(...)是使用超类'(在本例中为dict)构造函数(__init__)方法.

最后一行,self.__dict__ = self使得传递给__init__方法的关键字参数(kwargs)可以像属性一样被访问,即下面的代码中的ax,ay.

希望这有助于消除您的困惑.


joa*_*uin 5

您没有在示例中使用位置参数.所以相关的代码是:

class attrdict(dict):
    def __init__(self, **kwargs):
        dict.__init__(self, **kwargs)
        self.__dict__ = self
Run Code Online (Sandbox Code Playgroud)

在第一行中,您将类定义attrdict为的子类dict.在第二行中,您可以定义自动初始化实例的函数.您将关键字arguments(**kargs)传递给此函数.实例化时a:

 a = attrdict(x=1, y=2)
Run Code Online (Sandbox Code Playgroud)

你实际上在打电话

attrdict.__init__(a, {'x':1, 'y':2})
Run Code Online (Sandbox Code Playgroud)

dict实例核心初始化是通过初始化dict内置超类来完成的.这是在传递接收参数的第三行中完成的 attrdict.__init__.从而,

dict.__init__(self,{'x':1, 'y':2})
Run Code Online (Sandbox Code Playgroud)

使self(实例a)成为一个字典:

self ==  {'x':1, 'y':2}
Run Code Online (Sandbox Code Playgroud)

最好的事情发生在最后一行:每个实例都有一个包含其属性的字典.这是self.__dict__(即a.__dict__).

例如,如果

a.__dict__ = {'x':1, 'y':2} 
Run Code Online (Sandbox Code Playgroud)

我们可以分别写入a.xa.y获得值1或2.

所以,这就是第4行的作用:

self.__dict__ = self
Run Code Online (Sandbox Code Playgroud)

相当于:

a.__dict__ = a  where a = {'x':1, 'y':2}
Run Code Online (Sandbox Code Playgroud)

然后,我可以打电话a.xa.y.

希望不是太乱.