2024-03-28 10:58:48 发布
网友
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): def __init__(self, **kwargs): dict.__init__(self, **kwargs) self.__dict__ = self
在第一行中,您将类attrdict定义为dict的子类。 在第二行中,定义自动初始化实例的函数。将关键字参数(**kargs)传递给此函数。当您实例化a时:
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
self == {'x':1, 'y':2}
好事情发生在最后一行: 每个实例都有一个保存其属性的字典。这是self.__dict__(即a.__dict__)。
self.__dict__
a.__dict__
例如,如果
a.__dict__ = {'x':1, 'y':2}
我们可以分别写a.x或a.y并得到值1或2。
a.x
a.y
所以,这就是第4行的作用:
self.__dict__ = self
相当于:
a.__dict__ = a where a = {'x':1, 'y':2}
然后我可以调用a.x和a.y。
希望不是太乱。
这里有一篇很好的文章解释了__dict__:
__dict__
The Dynamic dict
attrdict类通过从字典继承然后将对象的__dict__设置为该字典来利用此漏洞。因此,对父字典(即它继承的dict类)进行任何属性访问。
本文的其余部分对于理解Python对象也很有帮助:
Python Attributes and Methods
我一行行一行的解释:
class attrdict(dict):
此行将类attrdict声明为内置dict类的子类。
def __init__(self, *args, **kwargs): dict.__init__(self, *args, **kwargs)
这是您的标准__init__方法。对dict.__init__(...)的调用是利用super 类(在本例中为dict)构造函数(__init__)方法。
__init__
dict.__init__(...)
最后一行self.__dict__ = self使得传递给__init__方法的关键字参数(kwargs)可以像下面代码中的属性(即a.x,a.y)一样被访问。
希望这有助于消除你的困惑。
您的示例中没有使用位置参数。所以相关代码是:
在第一行中,您将类
attrdict
定义为dict
的子类。 在第二行中,定义自动初始化实例的函数。将关键字参数(**kargs
)传递给此函数。当您实例化a
时:你真的在打电话
dict实例核心初始化是通过初始化
dict
内置超类来完成的。这是在传递在attrdict.__init__
中接收到的参数的第三行中完成的。 因此使
self
(实例a
)成为字典:好事情发生在最后一行: 每个实例都有一个保存其属性的字典。这是
self.__dict__
(即a.__dict__
)。例如,如果
我们可以分别写
a.x
或a.y
并得到值1或2。所以,这就是第4行的作用:
相当于:
然后我可以调用
a.x
和a.y
。希望不是太乱。
这里有一篇很好的文章解释了
__dict__
:The Dynamic dict
attrdict
类通过从字典继承然后将对象的__dict__
设置为该字典来利用此漏洞。因此,对父字典(即它继承的dict
类)进行任何属性访问。本文的其余部分对于理解Python对象也很有帮助:
Python Attributes and Methods
我一行行一行的解释:
此行将类attrdict声明为内置dict类的子类。
这是您的标准
__init__
方法。对dict.__init__(...)
的调用是利用super 类(在本例中为dict)构造函数(__init__
)方法。最后一行
self.__dict__ = self
使得传递给__init__
方法的关键字参数(kwargs)可以像下面代码中的属性(即a.x,a.y)一样被访问。希望这有助于消除你的困惑。
相关问题 更多 >
编程相关推荐