将属性(实例变量)添加到Python字典中



我能听听你对如何将属性(实例变量,而不是方法(添加到Python字典的想法吗?为了保持记录,我想插入额外的描述性变量。

关于具体性,这里有一个例子。我想让2号线工作:(

>>> x = {"fred": "male", "wilma": "female", "barney": "male"}
>>> x.show = "Flintstones"
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'dict' object has no attribute 'show'

我最接近的解决方案是一个类,它有一个实例变量和用于特征信息的字典。这很好,但有点乏味,因为所有对字典的访问都必须封装在obj.x中,而不仅仅是obj。我也可以获得一个嵌套字典的解决方案,但它引入了更复杂的代码来与较低级别的字典交互。我们不想按x.show对数据进行组织/排序,我们只想访问该变量。

这就是为什么我认为这是可能的。在过去,我创建了Pandas DataFrame子类,这样我就可以拥有Pandas Data Frame(2D存储(和实例变量。Pandas数据框架的工作原理类似于Pandas数据帧,但它也有这些额外的元变量。为了使Pandas DF子类工作,有一些花哨的舞蹈来声明实例变量,但最终它确实工作了。

一种方法是从字典中派生:

class AttrDict(dict):
def __init__(self, *args, **kwargs):
dict.__init__(self, *args, **kwargs)
self.x = "Flintstones"

a = AttrDict({"fred": "male", "wilma": "female", "barney": "male"})
a.x = "Wilma"

编辑:好的,我把这个和wjandrea的有效评论同时发布了。我仍然将答案作为如何实例化原始dict的演示。警告:此时数据将被复制。

如果您将字典分配给类的一个属性,则可以避免复制,但要按照您提到的价格(每次都需要对属性进行寻址(,除非您重载运算符,例如__getitem____setitem__

最新更新