Python的“类是dict”理论和添加类变量的后果

2024-04-25 01:03:20 发布

您现在位置:Python中文网/ 问答频道 /正文

出于好奇,我正在使用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

那很好,但是:

  1. fooclass还有1个属性吗?我怎么确定?你知道吗
  2. 这样添加属性安全吗?你知道吗
  3. 你有过这样的案子吗?你知道吗
  4. 我知道我做不到。。那么,为什么类和实例之间存在这种差异呢?你知道吗

Tags: 实例self属性objectdefargdictclass
1条回答
网友
1楼 · 发布于 2024-04-25 01:03:20

您正在更改实例的属性。添加和删除__dict__正是大多数自定义类实例所发生的事情。你知道吗

例外情况是当您有一个使用^{}的类时;这样的类的实例没有__dict__属性,因为属性是以不同的方式存储的。你知道吗

Python是一种允许成年人使用的语言;在任何情况下都不能防止向带有__dict__的实例添加属性,因此将它们添加到字典或使用setattr()没有区别。你知道吗

当您想使用现有的dict方法来访问或更改属性时,访问__dict__是很有帮助的;您可以使用dict.update()例如:

def Namespace(object):
    def __init__(self, **kwargs):
        self.__dict__.update(kwargs)

当试图读取实例上的属性时,如果类上有相应的data descriptor,那么它也很有用;要绕过后者,可以访问实例上的__dict__来访问该属性。您还可以使用它来测试实例上的属性,并忽略类或基类可能定义的任何内容。你知道吗

至于fooclass.__dict__;您将与类的实例相混淆。它们是独立的对象。类是不同类型的对象,ClassObj.__dict__只是一个代理对象;您仍然可以在类上使用setattr()来添加任意属性:

setattr(fooclass, 'arg2', 'value2')

或直接设置属性:

fooclass.arg2 = value2

类需要有一个__dict__代理,因为实际的__dict__属性是一个描述符对象,在实例上提供相同的属性。见What is the __dict__.__dict__ attribute of a Python class?

有关Python对象如何工作的详细信息记录在Datamodel reference documentation中。你知道吗

相关问题 更多 >