我有一个Python类,它存储一些字段并具有一些属性,比如
class A(object):
def __init__(self, x, y):
self.x = x
self.y = y
@property
def z(self):
return self.x+1
我需要对课程进行哪些更改才能完成
>>> a = A(1,5)
>>> dict(a)
{'y':5, 'z':2}
我在哪里指定要返回y
和z
?我不能只使用a.__dict__
,因为它包含x
但不包含z
。我希望能够指定可以使用__getattribute__
访问的任何内容。
答案 0 :(得分:11)
向您的类添加__iter__()
方法,该方法返回对象项的迭代器作为键值对。然后,您可以将对象实例直接传递给dict()
构造函数,因为它接受一系列键值对。
def __iter__(self):
for key in "y", "z":
yield key, getattr(self, key)
如果您希望它更灵活一些,并允许在子类(或以编程方式)上轻松覆盖属性列表,则可以将键列表存储为类的属性:
_dictkeys = "y", "z"
def __iter__(self):
for key in self._dictkeys:
yield key, getattr(self, key)
如果希望字典包含所有属性(包括从父类继承的属性),请尝试:
def __iter__(self):
for key in dir(self):
if not key.startswith("_"):
value = getattr(self, key)
if not callable(value):
yield key, value
这排除了以“_”开头的成员以及可调用的对象(例如类和函数)。
答案 1 :(得分:5)
我认为解决此问题的合理方法是创建asdict
方法。如果你想要指定你想要dict包含哪些键,我假设你对调用该方法时传递的信息感到满意。如果那不是你的意思,请告诉我。 (这包含kindall的优秀建议。)
class A(object):
def __init__(self, x, y):
self.x = x
self.y = y
@property
def z(self):
return self.x+1
def asdict(self, *keys):
if not keys:
keys = ['y', 'z']
return dict((key, getattr(self, key)) for key in keys)
测试:
>>> A(1, 2).asdict('x', 'y')
{'y': 2, 'x': 1}
>>> A(1, 2).asdict()
{'y': 2, 'z': 2}
答案 2 :(得分:0)
解决这个问题的一种天真的方法如下。它可能不足以满足您的需求,但我只是指出它以防您错过了它。
>>> dict(y=a.y, z=a.z)
>>> {'y': 5, 'z': 2}