将具有属性的python对象转换为字典

时间:2019-05-21 14:52:14

标签: python dictionary cython

我想知道如何从字典中转换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

3 个答案:

答案 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中的值将是该属性在使用时的副本,并且不会反映将来的更改。