我想知道为什么一个类__dict__是一个类mappingproxy,但实例__dict__只是一个简单的例子dict
>>> class A:
... pass
>>> a = A()
>>> type(a.__dict__)
<class 'dict'>
>>> type(A.__dict__)
<class 'mappingproxy'>
Run Code Online (Sandbox Code Playgroud) 好吧,我对__dict__属性感到很困惑.我搜索了很多,但我仍然不确定输出.在对象或类或函数中使用的情况下,是否可以解释从零开始使用此属性?谢谢你的每一件衣服
在阅读关于类型统一的内容时,我偶然发现内置类型有method_descriptors和builtin_function_or_methods而不是methods和functions,为什么呢?
>>> list.append
<method 'append' of 'list' objects>
>>> type(list.append)
<class 'method_descriptor'>
>>> [].append
<built-in method append of list object at 0x7f0c4214aef0>
>>> type([].append)
<class 'builtin_function_or_method'>
>>> class A(list):
... def append(self): pass
...
>>> A.append
<function A.append at 0x7f0c42168dd0>
>>> type(A.append)
<class 'function'>
>>> A().append
<bound method A.append of []>
>>> type(A().append)
<class 'method'>
Run Code Online (Sandbox Code Playgroud)
没有充分的理由class A将子列表子类化,我只是想表明类型不同.
class B(type):
__slots__ = ()
class A(metaclass=B):
pass
A.test = "test"
Run Code Online (Sandbox Code Playgroud)
"A"是元类的实例"B"并"B"已__slots__定义 - 为什么我__dict__在课堂上A?我如何在没有__dict__?
以下代码按排序顺序列出了名为“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 …Run Code Online (Sandbox Code Playgroud) 考虑这个例子,其中__dict__类的所有实例的 都A将指向全局 dict shared。
shared = {'a': 1, 'b': 2}
class A(object):
def __init__(self):
self.__dict__ = shared
Run Code Online (Sandbox Code Playgroud)
现在让我们测试一些事情:
>>> a = A()
>>> b = A()
>>> a.a, a.b, b.a, b.b
(1, 2, 1, 2)
>>> b.x = 100
>>> shared
{'a': 1, 'x': 100, 'b': 2}
>>> a.x
100
>>> c = A()
>>> c.a, c.b, c.x
(1, 2, 100)
>>> shared['foo'] = 'bar'
>>> a.foo, b.foo, c.foo
('bar', 'bar', 'bar')
>>> a.__dict__, b.__dict__, …Run Code Online (Sandbox Code Playgroud) 出于好奇,我正在使用__dict__Python类的属性.
我在某处读到python中的"类"是一种字典,并且调用__dict__类实例将实例转换为字典......我认为"很酷!我可以使用它!"
但这让我怀疑这些行为的正确性和安全性.
例如,如果我这样做:
class fooclass(object):
def __init__(self, arg):
self.arg1 = arg
p = fooclass('value1')
print(p.__dict__)
p.__dict__['arg2'] = 'value2'
print(p.__dict__)
print(p.arg2)
Run Code Online (Sandbox Code Playgroud)
我有这个:
>>>{'arg1': 'value1'}
>>>{'arg1': 'value1', 'arg2': 'value2'}
>>>value2
Run Code Online (Sandbox Code Playgroud)
那没关系,但是:
fooclass还有1个属性?我怎么能确定?fooclass.__dict__['arg2'] = 'value2'...为什么一个类和一个实例之间存在这种差异?