Как получить полный список методов и атрибутов объекта?

dir(re.compile(pattern)) 

не возвращает шаблон как один из элементов списков. А именно возвращает:

['__copy__', '__deepcopy__', 'findall', 'finditer', 'match', 'scanner', 'search', 'split', 'sub', 'subn']

Согласно инструкции, он должен содержать

the object's attributes' names, the names of its class's attributes, and recursively of the attributes of its class's base classes.

Он также говорит, что

The list is not necessarily complete.

Есть ли способ получить список полный? Я всегда предполагал, что dir возвращает полный список, но, видимо, это не так ...

Также: есть ли способ перечислить только атрибуты? Или только методы?

Обновлено: на самом деле это ошибка в python → предположительно исправлена ​​в ветке 3.0 (и, возможно, также в 2.6)

использование dir() или модуля inspect обычно является правильным способом сделать это. Вы использовали модуль re только в качестве примера или хотите достичь особой цели?

user3850 10.10.2008 16:50

Вы уверены, что шаблон действительно сохраняется как данные после компиляции? У меня создалось впечатление, что целью компиляции шаблона было создание конечных автоматов, необходимых для анализа данного шаблона.

Kyle Strand 20.03.2013 23:20

@hop нельзя обойти классами? Например, их можно сделать на __dir__().

ytpillai 11.08.2015 19:58

ytpillai: правильно, но только в Python 3. Тем не менее, вопрос в том, попадет ли такой класс под «общий случай»

user3850 12.08.2015 17:17
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
237
4
332 342
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Ответ принят как подходящий

Для списка атрибутов полный краткий ответ: нет. Проблема в том, что атрибуты фактически определены как аргументы, принимаемые встроенной функцией getattr. Поскольку пользователь может повторно реализовать __getattr__, внезапно разрешив любой тип атрибута, не существует универсального способа сгенерировать этот список. Функция dir возвращает ключи в атрибуте __dict__, то есть все атрибуты, доступные, если метод __getattr__ не реализован повторно.

Что касается второго вопроса, это не имеет смысла. Фактически, методы - это вызываемые атрибуты, не более того. Вы можете фильтровать вызываемые атрибуты и с помощью модуля inspect определять методы, методы или функции класса.

inspect.getmembers (re.compile (pattern)) также не передает шаблон в качестве члена, поэтому он, вероятно, внутренне использует dir ... Это отстой!

Bartosz Radaczyński 10.10.2008 16:28

Я также мог бы использовать callable, чтобы проверить, являются ли они методами, но дело не в этом ... Дело в том, что я не могу доверять dir, чтобы он возвращал даже список атрибутов, которые фактически общедоступны ...

Bartosz Radaczyński 10.10.2008 16:32

inspect должен быть "не менее" надежным, чем dir (). с другой стороны, re - очень сложный модуль

user3850 10.10.2008 16:57

Что вы определяете под «общедоступным»? Если вы имеете в виду «можно получить доступ», то это безнадежное дело по указанной причине. В противном случае dir всегда возвращает список атрибутов, доступных с реализацией getattr по умолчанию.

PierreBdR 10.10.2008 20:31

Что ж, взгляните на другой ответ. В ppython есть некоторое понятие публичной видимости, отсюда и реж, чтобы объекты могли контролировать то, что возвращается. Тем не менее, я столкнулся с этой проблемой, потому что я использую dir в интерактивной оболочке, например все время: D. Во всяком случае, да.

Bartosz Radaczyński 01.03.2009 21:15

dir (my_class) возвращает что-то отличное от my_class .__ dict __. keys (). первый также выводит методы класса, такие как в этом и док

JuanPi 19.03.2013 17:06

Что насчет help()? :П

ytpillai 11.08.2015 19:58

Вот почему в python 2.6 был добавлен новый метод __dir__().

видеть:

Я получаю такую ​​ошибку: >> dir __ (pyrenderdoc) Traceback (последний вызов последним): файл «<string>», строка 1, в <module> NameError: name '__dir 'не определено

Mona Jalal 30.12.2016 04:28

__dir __ () - это метод объекта, а не функция - прочтите ссылки в ответе и это

Moe 03.01.2017 17:06

Однострочник для печати всех атрибутов и их значений: pprint({k:getattr(ojb,k) for k in obj.__dir__()})

Czechnology 26.04.2018 11:42

Вот практическое дополнение к ответам PierreBdR и Moe:

  • Для Python> = 2.6 и классы нового стиляdir() кажется достаточно.
  • Для уроки старого стиля мы можем, по крайней мере, сделать то, что делает стандартный модуль для поддержки завершения табуляции: в дополнение к dir() ищите __class__, а затем перейдите к его __bases__:

    # code borrowed from the rlcompleter module
    # tested under Python 2.6 ( sys.version = '2.6.5 (r265:79063, Apr 16 2010, 13:09:56) \n[GCC 4.4.3]' )
    
    # or: from rlcompleter import get_class_members
    def get_class_members(klass):
        ret = dir(klass)
        if hasattr(klass,'__bases__'):
            for base in klass.__bases__:
                ret = ret + get_class_members(base)
        return ret
    
    
    def uniq( seq ): 
        """ the 'set()' way ( use dict when there's no set ) """
        return list(set(seq))
    
    
    def get_object_attrs( obj ):
        # code borrowed from the rlcompleter module ( see the code for Completer::attr_matches() )
        ret = dir( obj )
        ## if "__builtins__" in ret:
        ##    ret.remove("__builtins__")
    
        if hasattr( obj, '__class__'):
            ret.append('__class__')
            ret.extend( get_class_members(obj.__class__) )
    
            ret = uniq( ret )
    
        return ret
    

(Тестовый код и выходные данные удалены для краткости, но в основном для объектов нового стиля у нас, похоже, те же результаты для get_object_attrs(), что и для dir(), а для классов старого стиля основным дополнением к выходным данным dir() является атрибут __class__. )

Вот как я это делаю, полезно для простых настраиваемых объектов, к которым вы продолжаете добавлять атрибуты:

Учитывая объект, созданный с помощью obj = type("Obj",(object,),{}), или просто:

class Obj: pass
obj = Obj()

Добавьте некоторые атрибуты:

obj.name = 'gary'
obj.age = 32

затем, чтобы получить словарь только с настраиваемыми атрибутами:

{key: value for key, value in obj.__dict__.items() if not key.startswith("__")}

# {'name': 'gary', 'age': 32}

список всех атрибутов в Python 3.x: {ключ: значение для ключа, значение в obj .__ dict __. items (), если не key.startswith ("__")} ['_ декларированные_поля']. keys ()

above_c_level 09.06.2020 14:32

Только в дополнение:

  1. dir() - мощный / фундаментальный инструмент самый. (Наиболее рекомендуемый)
  2. Решения, отличные от dir(), просто предоставляют их путь обработки выход dir().

    Перечисляя атрибуты 2-го уровня или нет, важно выполнить просеивание самостоятельно, потому что иногда вам может потребоваться отсеять внутренние переменные с ведущими символами подчеркивания __, но иногда вам может потребоваться строка документа __doc__.

  3. __dir__() и dir() возвращают идентичный контент.
  4. __dict__ и dir() разные. __dict__ возвращает неполное содержимое.
  5. ВАЖНЫЙ: __dir__() может быть иногда перезаписан автором функцией, значением или типом для любых целей.

    Вот пример:

    \...\torchfun.py in traverse(self, mod, search_attributes)
    445             if prefix in traversed_mod_names:
    446                 continue
    447             names = dir(m)
    448             for name in names:
    449                 obj = getattr(m,name)
    

    TypeError: дескриптору __dir__ объекта 'object' требуется аргумент

    Автор PyTorch изменил метод __dir__() на то, что требует аргумента. Эта модификация приводит к отказу dir().

  6. Если вы хотите, чтобы схема надежный проходила через все атрибуты объекта, помните, что каждый питонический стандарт может быть отменено и не может удерживаться и все соглашения могут быть ненадежными.

Другие вопросы по теме