出于好奇,我正在使用Python类的__dict__
属性。你知道吗
我在某处读到,python中的“类”有点像dict,对类实例调用__dict__
将实例转换为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)
我有这个:
>>>{'arg1': 'value1'}
>>>{'arg1': 'value1', 'arg2': 'value2'}
>>>value2
那很好,但是:
fooclass
还有1个属性吗?我怎么确定?你知道吗
您正在更改实例的属性。添加和删除
__dict__
正是大多数自定义类实例所发生的事情。你知道吗例外情况是当您有一个使用^{} 的类时;这样的类的实例没有
__dict__
属性,因为属性是以不同的方式存储的。你知道吗Python是一种允许成年人使用的语言;在任何情况下都不能防止向带有
__dict__
的实例添加属性,因此将它们添加到字典或使用setattr()
没有区别。你知道吗当您想使用现有的
dict
方法来访问或更改属性时,访问__dict__
是很有帮助的;您可以使用dict.update()
例如:当试图读取实例上的属性时,如果类上有相应的data descriptor,那么它也很有用;要绕过后者,可以访问实例上的
__dict__
来访问该属性。您还可以使用它来测试实例上的属性,并忽略类或基类可能定义的任何内容。你知道吗至于
fooclass.__dict__
;您将类与类的实例相混淆。它们是独立的对象。类是不同类型的对象,ClassObj.__dict__
只是一个代理对象;您仍然可以在类上使用setattr()
来添加任意属性:或直接设置属性:
类需要有一个
__dict__
代理,因为实际的__dict__
属性是一个描述符对象,在实例上提供相同的属性。见What is the __dict__.__dict__ attribute of a Python class?有关Python对象如何工作的详细信息记录在Datamodel reference documentation中。你知道吗
相关问题 更多 >
编程相关推荐