Python - Использование метода и функций
Я хочу написать скрипт, который может читать структуру из модели AutoDesk Inventor. Inventor установлен и запущен, и к нему установлено соединение через win32.com. После загрузки модели в настройку несколько переменных я застрял.
У меня есть этот список oStructuredBOMView.BOMRows
>> print(len(oStructuredBOMView.BOMRows))
2
Я могу сослаться на один пункт
>> print(oStructuredBOMView.BOMRows.Item(1))
<win32com.gen_py.Autodesk Inventor Object Library.BOMRow instance at 0x88831536>
И с DIR я могу отобразить все функции / методы
>> print(dir(oStructuredBOMView.BOMRows.Item(1)))
['CLSID', 'GetReferenceKey', '_ApplyTypes_', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattr__', '__getattribute__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_get_good_object_', '_get_good_single_object_', '_oleobj_', '_prop_map_get_', '_prop_map_put_', 'coclass_clsid']
Это та точка, которую я не могу превзойти. Как я могу использовать эти функции / методы для получения дополнительной информации? Пример:
>> oStructuredBOMView.BOMRows.Item(1).sizeof
Traceback (most recent call last):
File "<pyshell#22>", line 1, in <module>
oStructuredBOMView.BOMRows.Item(1).sizeof
File "C:\python\Python35\lib\site-packages\win32com\client\__init__.py", line 473, in __getattr__
raise AttributeError("'%s' object has no attribute '%s'" % (repr(self), attr))
AttributeError: '<win32com.gen_py.Autodesk Inventor Object Library.BOMRow instance at 0x88417896>' object has no attribute 'sizeof'
>> sizeof(oStructuredBOMView.BOMRows.Item(1))
Traceback (most recent call last):
File "<pyshell#23>", line 1, in <module>
sizeof(oStructuredBOMView.BOMRows.Item(1))
NameError: name 'sizeof' is not defined
1 ответ
Во-первых, sizeof не является допустимой функцией python, поэтому вторая попытка не сработает.
Во-вторых, ваш атрибут объекта BOMRows Item называется __sizeof__
так что вы должны использовать это, а не просто "sizeof":
oStructuredBOMView.BOMRows.Item(1).__sizeof__
В-третьих, это просто атрибуты объекта, они могут быть или не быть функциями / методами, вы можете узнать, какие из них можно вызвать с помощью:
isMethod = callable(oStructuredBOMView.BOMRows.Item(1).__sizeof__)
См. https://docs.python.org/3/library/functions.html.
Обновление: вы можете попробовать print()
все атрибуты (это вроде очевидно, так что вы, возможно, уже пробовали это). Поскольку я ничего не знаю о моделях AutoDesk Inventor, я не могу помочь вам с прямым ответом, но вы могли бы попытаться глубже изучить объект. Если атрибут является "примитивным типом" (читай: печатный объект или объект, имеющий некоторое строковое представление), вы можете использовать его напрямую. Если ваш атрибут возвращает другой объект, вы должны проанализировать его снова с dir()
или же vars()
снова. Вы можете игнорировать большинство атрибутов двойного подчеркивания, так как они, скорее всего, от Python.
Пример попытки распечатать все атрибуты неизвестного объекта:
for key in dir(my_obj):
print('{}: {}'.format(key, getattr(my_obj, key))
Но я уверен, что должна быть доступная документация по использованию объектов Autodesk Inventor.
Браузер объектов изобретателя - ваш лучший друг, чтобы увидеть свойства и методы каждого класса в изобретателе. Чтобы открыть его, перейдите в редактор VBA и нажмите F2.
>> print(oStructuredBOMView.BOMRows.Item(1))
<win32com.gen_py.Autodesk Inventor Object Library.BOMRow instance at 0x88831536>
Это говорит о том, что класс BOMRow. Введите имя класса в поле поиска и перейдите оттуда.