Как опросить объект python о его структуре? - PullRequest
0 голосов
/ 17 февраля 2019

Есть ли способ программно определить структуру / модель объекта, его составные части, как его можно повторять, манипулировать и преобразовывать, разбивать и восстанавливать?

Метод проб и ошибок - замечательные учителя.Я беру их занятия каждый день.Но здесь я ищу способ «работать умнее» или, по крайней мере, по-другому.

Немного предыстории: недавно я провел слишком много часов, неправильно обрабатывая объект pandas groupby, потому что я не понималчасти строительного блока и типы, из которых это сделано.Я неправильно обработал кортеж, возвращаемый при итерации объекта groupby.Теперь у меня есть немного лучшее, но не совсем достаточное понимание этого конкретного объекта: например, groupby obj разбивается на "params" и "table" при повторении.table, в свою очередь, состоит из index и rows.Но я все еще не уверен, как справиться с rows: из чего они сделаны или сломаны. Этот пост содержит код для воспроизведения проблемы: см. Редактирование 2 внизу оригинального сообщения.

Но это частный случай;мой вопрос более общий.Мой вопрос: если я еще не знаю структуру или «модель» объекта / типа Python, как я могу запросить объект, чтобы раскрыть эту информацию в текстовом или, что еще лучше, в графическом виде?


Редактировать :

В целях изучения и изучения ниже я пытаюсь запустить каждый метод str для объекта str через цикл for.meth obj правильно интерпретируется в первых двух строках цикла (например, __add__ и __class__), но интерпретируется как meth, когда я пытаюсь запустить obj.meth.Как это исправить?

Вход:

obj = 'my_string'

object_methods = [method_name for method_name in dir(obj)
                  if callable(getattr(obj, method_name))]

print(len(object_methods))
print(object_methods)

Выход:

77
['__add__', '__class__', . . ., 'upper', 'zfill']

Вход:

for meth in object_methods:
    print(meth)
    try:
        print('obj.meth for obj', obj, 'and method', meth, ':') 
        obj.meth
    except AttributeError as e:
        print('obj.meth for obj', obj, 'and method', meth, ': AttributeError:', e)

Выход:

__add__
obj.meth for obj my_string and method __add__ :
obj.meth for obj my_string and method __add__ : AttributeError: 'str' object has no attribute 'meth'
__class__
obj.meth for obj my_string and method __class__ :
obj.meth for obj my_string and method __class__ : AttributeError: 'str' object has no attribute 'meth'
. . .

1 Ответ

0 голосов
/ 17 февраля 2019

Вы можете использовать __ dict ___ и dir , чтобы увидеть объектную модель.

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

jack = Person('jack',23)
print(jack.__dict__)
print(dir(jack))

Вывод:

{'age': 23, 'name': 'jack'}
['__doc__', '__init__', '__module__', 'age', 'name']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...