Список атрибутов объекта - 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 ]

6 голосов
/ 17 декабря 2018

Вы можете использовать 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) также

0 голосов
/ 12 июня 2019

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

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
0 голосов
/ 17 марта 2018

__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/'
>>>
0 голосов
/ 19 января 2017

Как написано до использования 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}

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

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

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

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

кодовые выходы:

{'path': '/questions'}

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

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

Пожалуйста, посмотрите следующее выполнение сценариев оболочки 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']
>>>
0 голосов
/ 08 сентября 2016
attributes_list = [attribute for attribute in dir(obj) if attribute[0].islower()]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...