2018年5月21日 星期一

[ Python 常見問題 ] Get all object attributes in Python?

Source From Here 
Question 
Is there a way to get all attributes/methods/fields/etc. of an object in Python

vars() is close to what I want, but it doesn't work unless an object has a __dict__, which isn't always true (e.g. it's not true for a list, a dict, etc.). 

How-To 
You can leverage built-in API dir to know all attributes/methods/fields of an object. e.g.: 
  1. >>> class Person:  
  2. ...     def __init__(self, name, age):  
  3. ...             self.name = name  
  4. ...             self.age = age  
  5. ...     def a(self):  
  6. ...             return self.age  
  7. ...     def n(self):  
  8. ...             return self.name  
  9. ...  
  10. >>> john = Person('John'37)  
  11. >>> john.a()  
  12. 37  
  13. >>> john.n()  
  14. 'John'  
  15. >>> dir(john)  
  16. ['__doc__''__init__''__module__''a''age''n''name']  


Then you can access the attribute(s) of an object by getattr
  1. >>> for attr in john.__dict__.keys():  
  2. ...     if attr.startswith('__'):  
  3. ...             continue  
  4. ...     attr_obj = getattr(john, attr)  
  5. ...     if callable(attr_obj):  
  6. ...             print('attr \'{}\' is a function or method'.format(attr))  
  7. ...     else:  
  8. ...             print('attr of {} with value={}'.format(attr, attr_obj))  
  9. ...  
  10. attr of age with value=37  
  11. attr of name with value=John  
  12. >>> getattr(john, 'a')  
  13. 0x7f0c64438d88>>  
  • >>> callable(getattr(john, 'a'))  
  • True  
  • From above example, you can notice that the __dict__ won't contain method(s)! 

    Supplement 
    How to get an attribute from an object in Python

    沒有留言:

    張貼留言

    [Git 文章收集] Differences between git merge and git rebase

    Source From  Here Preface Merging and rebasing are the two most popular way to applying changes from one branch into another one. They bot...