我想知道如何从字典中转换python对象(使用python3 btw)。我意识到已经问过(并回答了)这个问题(here)。但是,在我的情况下,对象是完全根据@property
值给出的,例如:
class Test:
@property
def value(self):
return 1.0
关于转换为字典:__dict__
类的Test
字典为空,因此vars
为空
功能无法正常工作:
>>> vars(Test())
{}
不过,我可以使用gettattr(Test(), 'value')
来获得1.0
,所以
该值存在。
注意:之所以提出这个看似人为的示例,是因为我试图将cython cdef class
(包含参数)转换为字典。推荐的使用cython封装带有属性的c结构的方法确实基于properties。
答案 0 :(得分:0)
也许您可能会滥用:
In [10]: type(Test().__class__.__dict__['value']) is property
Out[10]: True
因此,您检查对象的类,以及它是否具有类型property
的属性。
这是我要怎么做:
t = Test()
dictionary = {attr_name: getattr(t, attr_name)
for attr_name, method in t.__class__.__dict__.items()
if isinstance(method, property)}
答案 1 :(得分:0)
我认为您可以使用dir
:
a = Test()
dir(a)
输出:
['__doc__', '__module__', 'value']
所以您可以做类似的事情:
d = {}
for attr in dir(a):
if not attr.startswith("__"):
d[attr] = getattr(a, attr)
输出:
d = {'value': 1.0}
答案 2 :(得分:0)
那更糟。您可以想象在初始化时构建一个实例__dict__
,但是除了read_only常量属性之外,它什么也解决不了。因为dict中的值将是该属性在使用时的副本,并且不会反映将来的更改。