Python iterating through object attributes

182,374

Solution 1

UPDATED

For python 3, you should use items() instead of iteritems()

PYTHON 2

for attr, value in k.__dict__.iteritems():
        print attr, value

PYTHON 3

for attr, value in k.__dict__.items():
        print(attr, value)

This will print

'names', [a list with names]
'tweet', [a list with tweet]

Solution 2

You can use the standard Python idiom, vars():

for attr, value in vars(k).items():
    print(attr, '=', value)

Solution 3

Iterate over an objects attributes in python:

class C:
    a = 5
    b = [1,2,3]
    def foobar():
        b = "hi"    

for attr, value in C.__dict__.iteritems():
    print "Attribute: " + str(attr or "")
    print "Value: " + str(value or "")

Prints:

python test.py
Attribute: a
Value: 5
Attribute: foobar
Value: <function foobar at 0x7fe74f8bfc08>
Attribute: __module__
Value: __main__
Attribute: b
Value: [1, 2, 3]
Attribute: __doc__
Value:
Share:
182,374

Related videos on Youtube

Zach Johnson
Author by

Zach Johnson

Updated on June 27, 2020

Comments

  • Zach Johnson
    Zach Johnson almost 4 years

    How do I iterate over an object's attributes in Python?

    I have a class:

    class Twitt:
        def __init__(self):
            self.usernames = []
            self.names = []
            self.tweet = []
            self.imageurl = []
    
        def twitter_lookup(self, coordinents, radius):
            cheese = []
            twitter = Twitter(auth=auth)
            coordinents = coordinents + "," + radius
            print coordinents
            query = twitter.search.tweets(q="", geocode=coordinents, rpp=10)
            for result in query["statuses"]:
                self.usernames.append(result["user"]["screen_name"])
                self.names.append(result['user']["name"])
                self.tweet.append(h.unescape(result["text"]))
                self.imageurl.append(result['user']["profile_image_url_https"])
    

    Now I can get my info by doing this:

    k = Twitt()
    k.twitter_lookup("51.5033630,-0.1276250", "1mi")
    print k.names
    

    I want to be able to do is iterate over the attributes in a for loop like so:

    for item in k:
       print item.names
    
    • levi
      levi over 9 years
      what attributes ? you mean over 'k' attributes?
    • Zach Johnson
      Zach Johnson over 9 years
      I may not be using the proper terminology here but yes I want to be able to have my usernames, tweets, etc. returned in some sort of object that i can iterate through them individually. like so: for item in twitter print item.usernames. Something along those lines.
    • levi
      levi over 9 years
      try my answer and see if works for you.
  • trdavidson
    trdavidson over 7 years
    k.iteritems() was removed in Python3, use k.items() instead.
  • levi
    levi over 7 years
    @trdavidson I added the note.
  • Free Url
    Free Url over 6 years
    Also new in python3 you need parens for the print operation.
  • Davos
    Davos about 6 years
    Hidden __dict__ method very useful! Also, to return as a dict use a dict comprehension print({attr:value for attr, value in k.__dict__.iteritems()})
  • alex
    alex almost 6 years
    I tried this on an object which is inheriting from another one, and it only returned the properties belonging to the base class.
  • Konstantin Sekeresh
    Konstantin Sekeresh over 4 years
    This works if and only if the object has a __dict__ attribute. This is not always true, and you should iterate through __slots__ if it doesn't.