Per*_*ous 5 python dictionary magic-methods
以下代码按排序顺序列出了名为“A”的类的属性:-
>>> class A():
def __init__(self, i):
self.at = i
>>> sorted(vars(A))
['__dict__', '__doc__', '__init__', '__module__', '__weakref__']
Run Code Online (Sandbox Code Playgroud)
现在,打印键的值,'__dict__'结果如下:-
>>> vars(A)['__dict__'] #Value of '__dict__'
<attribute '__dict__' of 'A' objects>
Run Code Online (Sandbox Code Playgroud)
根据文档, vars([object])
返回具有
__dict__属性的模块、类、实例或任何其他对象的__dict__属性。
我不明白的是,'__dict__'列表中的属性是用于vars()返回属性的相同属性,A还是具有其他目标的不同属性,例如按照建议(根据我的说法)实现 A 的对象命名空间的值其中成立。'__dict__'
编辑:-
问题的第一部分与另一个问题(也由@eliotness 提到)非常相关,但这是第二部分(如下所述),我找不到任何答案或相关问题,因此,更改标题题。
让我们考虑另一个在 Python 中生成最终基类属性列表的代码object:-
>>> sorted(vars(object))
['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', ...., '__str__', '__subclasshook__']
>>> hasattr(object, '__dict__')
True
>>> sorted(getattr(object, '__dict__')) == sorted(vars(object))
True
Run Code Online (Sandbox Code Playgroud)
来自文档的另一个引文关于 object.__dict__
用于存储对象(可写)属性的字典或其他映射对象。
这一次,'__dict__'没有出现在 的列表中object。那么,该__dict__属性是否为只读属性,以防万一object或任何其他原因?
另外,是否有可能以任何方式获取 Python 中的只读属性列表?
您的问题的第一部分已经由链接的答案回答:__dict__实例的实例作为描述符存储在类上。这是A.__dict__['__dict__']. A.__dict__另一方面存储A类的所有属性 - 类本身是 的实例type。所以实际上它type.__dict__['__dict__']提供了这些变量:
>>> type.__dict__['__dict__']
<attribute '__dict__' of 'type' objects>
>>> A.__dict__ == type.__dict__['__dict__'].__get__(A)
True
Run Code Online (Sandbox Code Playgroud)
__dict__您看不到属性的原因object是因为它没有属性。这意味着您无法在object实例上设置实例变量:
>>> o = object()
>>> o.x = 1
AttributeError: 'object' object has no attribute 'x'
Run Code Online (Sandbox Code Playgroud)
通过定义自定义类可以实现类似的行为__slots__:
>>> class B:
... __slots__ = ()
...
>>> vars(B)
mappingproxy({'__module__': '__main__', '__slots__': (), '__doc__': None})
>>>
>>> b = B()
>>> b.x = 1
AttributeError: 'B' object has no attribute 'x'
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
496 次 |
| 最近记录: |