我能听听你对如何将属性(实例变量,而不是方法(添加到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__
。