Python Forum

Full Version: Listing Attributes of Objects & Classes
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Hello all

I have started to create classes and objects in python, progress is slow but i am getting there.

I wanted to ask the community whether it was possible to output all the attributes of a class/object.

I have created the following class:-

import inspect

class Helloclass:
    
    def __init__(self):
        self.A = ""
        self.B = ""
        self.C = ""
        self.D = ""

london = Helloclass()
london.A = "Apples"
london.D = 120

print(inspect.getmembers(london))
I have created an object called london from Helloclass (so london is an instance of Helloclass).

There are 4 x properties that i coded into the class these are A, B, C, D.

I have assigned the string Apples to the A attribute of the london object.

I have assigned the value 120 to the A attribute of the london object.

I wanted to print out all of the available properties of the london object or the Helloclass Class.

I have used the module inspect, however this gives me a horrible out and looks like:-

[('A', 'Apples'), ('B', ''), ('C', ''), ('D', 120), ('__class__', <class '__main__.Helloclass'>), ('__delattr__', <method-wrapper '__delattr__' of Helloclass object at 0x000001E6B704CD00>), ('__dict__', {'A': 'Apples', 'B': '', 'C': '', 'D': 120}), ('__dir__', <built-in method __dir__ of Helloclass object at 0x000001E6B704CD00>), ('__doc__', None), ('__eq__', <method-wrapper '__eq__' of Helloclass object at 0x000001E6B704CD00>), ('__format__', <built-in method __format__ of Helloclass object at 0x000001E6B704CD00>), ('__ge__', <method-wrapper '__ge__' of Helloclass object at 0x000001E6B704CD00>), ('__getattribute__', <method-wrapper '__getattribute__' of Helloclass object at 0x000001E6B704CD00>), ('__gt__', <method-wrapper '__gt__' of Helloclass object at 0x000001E6B704CD00>), ('__hash__', <method-wrapper '__hash__' of Helloclass object at 0x000001E6B704CD00>), ('__init__', <bound method Helloclass.__init__ of <__main__.Helloclass object at 0x000001E6B704CD00>>), ('__init_subclass__', <built-in method __init_subclass__ of type object at 0x000001E6B57CF350>), ('__le__', <method-wrapper '__le__' of Helloclass object at 0x000001E6B704CD00>), ('__lt__', <method-wrapper '__lt__' of Helloclass object at 0x000001E6B704CD00>), ('__module__', '__main__'), ('__ne__', <method-wrapper '__ne__' of Helloclass object at 0x000001E6B704CD00>), ('__new__', <built-in method __new__ of type object at 0x00007FFF9F7DCB50>), ('__reduce__', <built-in method __reduce__ of Helloclass object at 0x000001E6B704CD00>), ('__reduce_ex__', <built-in method __reduce_ex__ of Helloclass object at 0x000001E6B704CD00>), ('__repr__', <method-wrapper '__repr__' of Helloclass object at 0x000001E6B704CD00>), ('__setattr__', <method-wrapper '__setattr__' of Helloclass object at 0x000001E6B704CD00>), ('__sizeof__', <built-in method __sizeof__ of Helloclass object at 0x000001E6B704CD00>), ('__str__', <method-wrapper '__str__' of Helloclass object at 0x000001E6B704CD00>), ('__subclasshook__', <built-in method __subclasshook__ of type object at 0x000001E6B57CF350>), ('__weakref__', None)]
Although this gives me what i want, there is so much extra stuff which i do not need or want to see.

I just want the output to be something like:-
london Object of Class Helloclass
london.A = "Apples"
london.B = ""
london.C = ""
london.D = 120

Is there anyway of getting a cleaner out?

Thank you.
You could define your own function, such as
def report(obj, name=None):
    name = name or 'obj'
    L = ['{} Object of Class {}'.format(name, type(obj).__name__)]
    for k, v in vars(obj).items():
        L.append('{}.{} = {}'.format(name, k, repr(v)))
    return '\n'.join(L)

print(report(london, 'london'))
Use vars().

In [1]: class Helloclass:
   ...:
   ...:     def __init__(self):
   ...:         self.A = ""
   ...:         self.B = ""
   ...:         self.C = ""
   ...:         self.D = ""
   ...:
   ...: london = Helloclass()
   ...: london.A = "Apples"
   ...: london.D = 120
   ...:
   ...: print(vars(london))
   ...: print(london.__dict__)
   ...:
   ...:
{'A': 'Apples', 'B': '', 'C': '', 'D': 120}
{'A': 'Apples', 'B': '', 'C': '', 'D': 120}
(Aug-27-2020, 06:30 AM)Gribouillis Wrote: [ -> ]You could define your own function, such as
def report(obj, name=None):
    name = name or 'obj'
    L = ['{} Object of Class {}'.format(name, type(obj).__name__)]
    for k, v in vars(obj).items():
        L.append('{}.{} = {}'.format(name, k, repr(v)))
    return '\n'.join(L)

print(report(london, 'london'))

Thanks
Out of interest, why? You know what the attributes are, so why not just print them out? If you were implementing __str__, you'd be providing your own string representation of the object.

Also, your class doesn't seem to be a well defined thing. Perhaps you're not really understanding what classes are for?