Проверьте базовый тип свойства в Python - PullRequest
0 голосов
/ 06 сентября 2018

Я пытаюсь выяснить, какого рода объект в Python (это метод? Это класс? Это статический метод?), Используя атрибуты, например:

Перебор объектов, присутствующих в __dict__ объекте атрибута моего модуля: Если объект имеет атрибут с именем __class__ и его атрибут __name__ равен "class", то это класс. Если нет, то это переменная, определенная в моем модуле (класса, который вернул __name__).

Если объект имеет атрибут с именем "func_name", это метод. Проблема возникает, когда я сталкиваюсь с так называемыми properties . Объект свойства prop.attr("__class__").attr("__name__")" вернет "property". Но как я могу извлечь тип собственности? Я хочу знать, если это число с плавающей запятой, целое число и т. Д.

>>>Vector3 is a class
>>>Vector3 has a member Y (property)
>>><property object at 0x000002840809E278>
>>>Y property attributes: ['__class__', '__delattr__', '__delete__', '__doc__', '__format__', '__get__', '__getattribute__', '__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__set__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'deleter', 'fdel', 'fget', 'fset', 'getter', 'setter']

Я не могу использовать getter, __get__ и т. Д., Потому что у меня нет экземпляра объекта для вызова этого свойства через него (геттер принимает объект в качестве аргумента).

Для контекста я проверяю эти объекты из кода C ++, используя Boost.Python, но, поскольку я использую только атрибуты, я думаю, что это не имеет отношения к решению. Просто чтобы объяснить, почему я не использую более обычный метод, скажем, с модулем inspect.

1 Ответ

0 голосов
/ 06 сентября 2018

Я думаю, что это невозможно из-за динамической природы Python.

Мне удалось решить эту проблему, задокументировав свойства и прочитав атрибут __doc__

...