Перечислить атрибуты объекта

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

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". Я хочу, чтобы это отображало текущие атрибуты из разных частей script.

Ответ 1

>>> 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.

Ответ 2

dir(instance)
# or (same value)
instance.__dir__()
# or
instance.__dict__

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

Ответ 3

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

Ответ 4

>>> ', '.join(i for i in dir(a) if not i.startswith('__'))
'multi, str'

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

Ответ 5

Модуль 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, поскольку первый - это просто строка (ее имя).

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

Ответ 6

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

1. dir()

2. vars()

3. __dict__

>>> 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'}

Ответ 7

Часто упоминалось, что для перечисления полного списка атрибутов вы должны использовать dir(). Обратите внимание, однако, что вопреки распространенному мнению dir() не выявляются все атрибуты. Например, вы можете заметить, что __name__ может отсутствовать в списке классов dir(), даже если вы можете получить к нему доступ из самого класса. Из документа doc на 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)

Ответ 8

Вы можете использовать dir(your_object) для получения атрибутов и getattr(your_object, your_object_attr) для получения значений

использование:

for att in dir(your_object):
    print (att, getattr(your_object,att))

Это особенно полезно, если у вашего объекта нет __dict__. Если это не так, вы можете попробовать var (your_object) также

Ответ 9

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

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

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

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

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

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

Ответ 10

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

#! /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) )

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

[email protected]:~/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']

[email protected]:~/skyset$

Ответ 11

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

>>> 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

Ответ 12

Как написано перед использованием obj.__dict__, можно обрабатывать обычные случаи, но некоторые классы не имеют атрибута __dict__ и используют __slots__ (в основном для эффективности памяти).

пример для более гибкого способа сделать это:

class A(object):
    __slots__ = ('x', 'y', )
    def __init__(self, x, y):
        self.x = x
        self.y = y


class B(object):
    def __init__(self, x, y):
        self.x = x
        self.y = y


def get_object_attrs(obj):
    try:
        return obj.__dict__
    except AttributeError:
        return {attr: getattr(obj, attr) for attr in obj.__slots__}


a = A(1,2)
b = B(1,2)
assert not hasattr(a, '__dict__')

print(get_object_attrs(a))
print(get_object_attrs(b))

этот вывод кода:

{'x': 1, 'y': 2}
{'x': 1, 'y': 2}

Note1:
Python - динамический язык, и он всегда лучше знает классы, из которых вы пытаетесь получить атрибуты, поскольку даже этот код может пропустить некоторые случаи.

Примечание2:
этот код выводит только переменные экземпляра, что означает, что переменные класса не предусмотрены. например:

class A(object):
    url = 'http://stackoverflow.com'
    def __init__(self, path):
        self.path = path

print(A('/questions').__dict__)

вывод кода:

{'path': '/questions'}

Этот код не печатает атрибут класса url и может опустить требуемые атрибуты класса.
Иногда мы могли бы подумать, что атрибут является членом экземпляра, но он не показан и не будет показан с использованием этого примера.

Ответ 13

Получить атрибуты объекта

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

new_object = new_class(2)                
print(dir(new_object))                   #total list attributes of new_object
attr_value = new_object.__dict__         
print(attr_value)                        #Dictionary of attribute and value for new_class                   

for attr in attr_value:                  #attributes on  new_class
    print(attr)

Выход

['__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']

{'multi': 4, 'str': '2'}

multi
str

Ответ 14

attributes_list = [attribute for attribute in dir(obj) if attribute[0].islower()]

Ответ 15

Пожалуйста, просмотрите следующее исполнение сценария оболочки Python в последовательности, оно даст решение от создания класса для извлечения имен полей экземпляров.

>>> class Details:
...       def __init__(self,name,age):
...           self.name=name
...           self.age =age
...       def show_details(self):
...           if self.name:
...              print "Name : ",self.name
...           else:
...              print "Name : ","_"
...           if self.age:
...              if self.age>0:
...                 print "Age  : ",self.age
...              else:
...                 print "Age can't be -ve"
...           else:
...              print "Age  : ","_"
... 
>>> my_details = Details("Rishikesh",24)
>>> 
>>> print my_details
<__main__.Details instance at 0x10e2e77e8>
>>> 
>>> print my_details.name
Rishikesh
>>> print my_details.age
24
>>> 
>>> my_details.show_details()
Name :  Rishikesh
Age  :  24
>>> 
>>> person1 = Details("",34)
>>> person1.name
''
>>> person1.age
34
>>> person1.show_details
<bound method Details.show_details of <__main__.Details instance at 0x10e2e7758>>
>>> 
>>> person1.show_details()
Name :  _
Age  :  34
>>>
>>> person2 = Details("Rob Pike",0)
>>> person2.name
'Rob Pike'
>>> 
>>> person2.age
0
>>> 
>>> person2.show_details()
Name :  Rob Pike
Age  :  _
>>> 
>>> person3 = Details("Rob Pike",-45)
>>> 
>>> person3.name
'Rob Pike'
>>> 
>>> person3.age
-45
>>> 
>>> person3.show_details()
Name :  Rob Pike
Age can't be -ve
>>>
>>> person3.__dict__
{'age': -45, 'name': 'Rob Pike'}
>>>
>>> person3.__dict__.keys()
['age', 'name']
>>>
>>> person3.__dict__.values()
[-45, 'Rob Pike']
>>>

Ответ 16

В дополнение к этим ответам я включу функцию (python 3) для выдачи практически всей структуры любого значения. Он использует dir для создания полного списка имен свойств, затем использует getattr с каждым именем. Он отображает тип каждого элемента значения и, когда возможно, также отображает весь элемент:

import json

def get_info(obj):

  type_name = type(obj).__name__
  print('Value is of type {}!'.format(type_name))
  prop_names = dir(obj)

  for prop_name in prop_names:
    prop_val = getattr(obj, prop_name)
    prop_val_type_name = type(prop_val).__name__
    print('{} has property "{}" of type "{}"'.format(type_name, prop_name, prop_val_type_name))

    try:
      val_as_str = json.dumps([ prop_val ], indent=2)[1:-1]
      print('  Here\ the {} value: {}'.format(prop_name, val_as_str))
    except:
      pass

Теперь любое из следующего должно дать понимание:

get_info(None)
get_info('hello')

import numpy
get_info(numpy)
# ... etc.

Ответ 17

__attr__ дает список атрибутов экземпляра.

>>> import requests
>>> r=requests.get('http://www.google.com')
>>> r.__attrs__
['_content', 'status_code', 'headers', 'url', 'history', 'encoding', 'reason', 'cookies', 'elapsed', 'request']
>>> r.url
'http://www.google.com/'
>>>