繁体   English   中英

class,dict,self,init,args?

[英]class, dict, self, init, args?

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

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

我的逐行解释:

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。

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

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

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

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

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

你实际上在打电话

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

dict实例核心初始化是通过初始化dict内置超类来完成的。 这是在传递attrdict.__init__接收的参数的第三行中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} 

我们可以写axay并分别获得值1或2。

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

self.__dict__ = self

相当于:

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

然后我可以打电话给axay

希望不是太乱。

这是一篇解释__dict__的好文章:

动态词典

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

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

Python属性和方法

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM