Список атрибутов объекта - PullRequest
217 голосов
/ 20 апреля 2010

Есть ли способ получить список атрибутов, которые существуют в экземплярах класса?

class new_class():
    def __init__(self, number):
        self.multi = int(number) * 2
        self.str = str(number)

a = new_class(2)
print(', '.join(a.SOMETHING))

Желаемый результат - вывод «multi, str». Я хочу видеть текущие атрибуты из разных частей скрипта.

Ответы [ 16 ]

218 голосов
/ 20 апреля 2010
>>> class new_class():
...   def __init__(self, number):
...     self.multi = int(number) * 2
...     self.str = str(number)
... 
>>> a = new_class(2)
>>> a.__dict__
{'multi': 4, 'str': '2'}
>>> a.__dict__.keys()
dict_keys(['multi', 'str'])

Вы также можете найти pprint полезными.

131 голосов
/ 20 апреля 2010
dir(instance)
# or (same value)
instance.__dir__()
# or
instance.__dict__

Затем вы можете проверить тип с помощью type() или метод с callable().

54 голосов
/ 12 августа 2015

vars(obj) возвращает атрибуты объекта.

27 голосов
/ 20 апреля 2010
>>> ', '.join(i for i in dir(a) if not i.startswith('__'))
'multi, str'

Это, конечно, напечатает любые методы или атрибуты в определении класса. Вы можете исключить "частные" методы, изменив i.startwith('__') на i.startwith('_')

22 голосов
/ 19 января 2017

Модуль inspect предоставляет простые способы проверки объекта:

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


Используя getmembers(), вы можете видеть все атрибуты вашего класса, а также их значение. Чтобы исключить частные или защищенные атрибуты, используйте .startswith('_'). Чтобы исключить методы или функции, используйте inspect.ismethod() или inspect.isfunction().

import inspect


class NewClass(object):
    def __init__(self, number):
        self.multi = int(number) * 2
        self.str = str(number)

    def func_1(self):
        pass


a = NewClass(2)

for i in inspect.getmembers(a):
    # Ignores anything starting with underscore 
    # (that is, private and protected attributes)
    if not i[0].startswith('_'):
        # Ignores methods
        if not inspect.ismethod(i[1]):
            print(i)

Обратите внимание, что ismethod() используется для второго элемента i, поскольку первый - это просто строка (его имя).

Оффтоп: используйте CamelCase для имен классов.

13 голосов
/ 29 сентября 2018

Все предыдущие ответы верны, у вас есть три варианта того, что вы спрашиваете

1 реж ()

2 вары ()

3. __ ДИКТ __

>>> dir(a)
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'multi', 'str']
>>> vars(a)
{'multi': 4, 'str': '2'}
>>> a.__dict__
{'multi': 4, 'str': '2'}
10 голосов
/ 09 октября 2016

Часто упоминается, что для получения полного списка атрибутов вы должны использовать dir(). Однако обратите внимание, что вопреки распространенному мнению dir() не выявляет всех атрибутов. Например, вы можете заметить, что __name__ может отсутствовать в списке dir() класса, даже если вы можете получить к нему доступ из самого класса. Из документа dir() ( Python 2 , Python 3 ):

Поскольку dir () поставляется в основном для удобства использования на интерактивная подсказка, она пытается предоставить интересный набор имен больше, чем он пытается предоставить строго или последовательно определенный набор имен, и его подробное поведение может меняться в разных выпусках. За Например, атрибуты метакласса отсутствуют в списке результатов, когда Аргумент - это класс.

Функция, подобная следующей, имеет тенденцию быть более полной, хотя нет гарантии полноты, поскольку на список, возвращаемый dir(), могут влиять многие факторы, включая реализацию метода __dir__() или настройку __getattr__() или __getattribute__() по классу или одному из его родителей. Смотрите предоставленные ссылки для более подробной информации.

def dirmore(instance):
    visible = dir(instance)
    visible += [a for a in set(dir(type)).difference(visible)
                if hasattr(instance, a)]
    return sorted(visible)
9 голосов
/ 20 апреля 2010

Зачем тебе это? Может быть трудно получить лучший ответ, не зная вашего точного намерения.

  • Почти всегда лучше сделать это вручную, если вы хотите отобразить экземпляр вашего класса определенным образом. Это будет включать именно то, что вы хотите, а не то, что вы не хотите, и порядок будет предсказуемым.

    Если вы ищете способ отображения содержимого класса, вручную отформатируйте атрибуты, которые вас интересуют, и предоставьте это как __str__ или __repr__ метод для вашего класса.

  • Если вы хотите узнать, какие методы существуют для объекта, чтобы понять, как он работает, используйте help. help(a) покажет вам форматированный вывод о классе объекта на основе его строк документации.

  • dir существует для программного получения всех атрибутов объекта. (Доступ к __dict__ делает то, что я бы сгруппировал как то же самое, но я бы не использовал сам.) Однако это может не включать то, что вы хотите, и это может включать в себя то, что вы не хотите. Это ненадежно, и люди думают, что хотят этого гораздо чаще, чем хотят.

  • На несколько ортогональной ноте, в настоящее время очень мало поддержки Python 3. Если вы заинтересованы в написании реального программного обеспечения, вам понадобятся сторонние материалы, такие как numpy, lxml, Twisted, PIL или любое количество веб-фреймворков, которые еще не поддерживают Python 3 и не планируют делать это слишком рано. Различия между 2.6 и веткой 3.x невелики, но разница в поддержке библиотек огромна.

7 голосов
/ 30 марта 2017

Пожалуйста, смотрите скрипт оболочки python, который был выполнен последовательно, здесь вы получите атрибуты класса в строковом формате, разделенные запятой.

>>> class new_class():
...     def __init__(self, number):
...         self.multi = int(number)*2
...         self.str = str(number)
... 
>>> a = new_class(4)
>>> ",".join(a.__dict__.keys())
'str,multi'<br/>

Я использую Python 3.4

7 голосов
/ 12 июня 2016

Существует несколько способов сделать это:

#! /usr/bin/env python3
#
# This demonstrates how to pick the attiributes of an object

class C(object) :

  def __init__ (self, name="q" ):
    self.q = name
    self.m = "y?"

c = C()

print ( dir(c) )

При запуске этот код выдает:

jeffs@jeff-desktop:~/skyset$ python3 attributes.py 
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__',      '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'm', 'q']

jeffs@jeff-desktop:~/skyset$
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...