11
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

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

4

3 回答 3

7

我逐行解释:

class attrdict(dict):

这一行将一个类 attrdict 声明为内置 dict 类的子类。

def __init__(self, *args, **kwargs): 
    dict.__init__(self, *args, **kwargs)

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

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

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

于 2010-04-14T22:33:59.190 回答
5

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

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

在第一行中,您将 class 定义attrdictdict. 在第二行中,您定义了自动初始化您的实例的函数。您将关键字参数 ( **kargs) 传递给此函数。当你实例化a

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

你实际上是在打电话

attrdict.__init__(a, {'x':1, 'y':2})

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

dict.__init__(self,{'x':1, 'y':2})

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

self ==  {'x':1, 'y':2}

好消息出现在最后一行:每个实例都有一个保存其属性的字典。这是self.__dict__(即a.__dict__)。

例如,如果

a.__dict__ = {'x':1, 'y':2} 

我们可以分别写a.xora.y和获取值 1 或 2。

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

self.__dict__ = self

相当于:

a.__dict__ = a  where a = {'x':1, 'y':2}

然后我可以调用a.xand a.y

希望不要太乱。

于 2010-04-14T23:17:43.323 回答
4

这是一篇很好的文章,它解释了__dict__

动态字典

该类attrdict通过从字典继承然后将对象设置__dict__为该字典来利用它。因此,任何属性访问都会针对父字典(即dict它继承的类)进行。

本文的其余部分对于理解 Python 对象也非常有用:

Python 属性和方法

于 2010-04-14T22:33:37.020 回答