class, dict, self, init, args?
1 2 3 4 5 6 7 8 9 10 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 |
有人能用文字解释前四行吗?我读过关于类和方法的书。但这里看起来很混乱。
我一行一行的拍摄说明:
1 | class attrdict(dict): |
此行将类attrdict声明为内置dict类的子类。
1 2 | def __init__(self, *args, **kwargs): dict.__init__(self, *args, **kwargs) |
这是你的标准方法。对
最后一行,
希望这有助于消除你的困惑。
您的示例中没有使用位置参数。所以相关的代码是:
1 2 3 4 | class attrdict(dict): def __init__(self, **kwargs): dict.__init__(self, **kwargs) self.__dict__ = self |
在第一行中,您将类
1 | a = attrdict(x=1, y=2) |
你在打电话
1 | attrdict.__init__(a, {'x':1, 'y':2}) |
dict实例核心初始化是通过初始化
1 | dict.__init__(self,{'x':1, 'y':2}) |
使
1 | self == {'x':1, 'y':2} |
好事情发生在最后一行:每个实例都有一个保存其属性的字典。这是
例如,如果
1 | a.__dict__ = {'x':1, 'y':2} |
我们可以写
所以,这就是第4行所做的:
1 | self.__dict__ = self |
相当于:
1 | a.__dict__ = a where a = {'x':1, 'y':2} |
然后我可以打电话给
希望不是太乱。
这是一篇很好的文章,解释了
动态口述
本文的其余部分对于理解Python对象也非常有用:
python属性和方法