Преобразование объекта Python со свойствами в словарь - PullRequest
1 голос
/ 21 мая 2019

Я хотел бы знать, как преобразовать объект python из словаря (используя python3, кстати). Я понимаю, что этот вопрос уже был задан (и получен ответ) ( здесь ). Однако в моем случае объект задается полностью в виде значений @property, например:

class Test: 
    @property  
    def value(self): 
        return 1.0       

Что касается преобразования в словарь: словарь __dict__ класса Test пуст, и, следовательно, vars функция не работает должным образом:

>>> vars(Test()) 
{}

Тем не менее, я могу использовать gettattr(Test(), 'value'), чтобы получить 1.0, так значение присутствует.

Примечание: причина, по которой я придумываю этот явно надуманный пример, заключается в том, что я пытаюсь преобразовать цитон cdef class (содержащий параметры) в словарь. Рекомендованный способ обертывания структур c свойствами с использованием Cython действительно основан на properties .

Ответы [ 3 ]

0 голосов
/ 21 мая 2019

Я думаю, вы могли бы использовать 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}
0 голосов
/ 21 мая 2019

Это даже хуже того. Вы можете представить себе создание экземпляра __dict__ во время инициализации, но это ничего не решит, кроме константных свойств read_only. Потому что значение в dict будет копией свойства на момент его получения и не будет отражать будущие изменения.

0 голосов
/ 21 мая 2019

Может быть, вы могли бы злоупотребить этим:

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)} 
...