How do you know attributes vs methods in Python object? When using the dir method it only list everything for example dir('string').
            Asked
            
        
        
            Active
            
        
            Viewed 413 times
        
    3
            
            
        - 
                    3Neither of the two linked questions are answering the OP's. They're asking how to **test** the difference between method and attribute, not what they are or how to get the full list. – GPhilo Jul 27 '20 at 12:22
1 Answers
5
            You can test the attributes's type:
from types import MethodType
from pprint import pprint
class A(object):
  def __init__(self) -> None:
    self._field = 3
    self._callable_field = lambda x: x
  
  def my_method(self):
    pass
  @classmethod
  def my_static_method(cls):
    pass
  def __str__(self) -> str:
    return repr(self)
A.another_method = lambda self: None
a = A()
pprint([(d, type(getattr(a,d)) is MethodType) for d in dir(a)])
prints
[('__class__', False),
 ('__delattr__', False),
 ('__dict__', False),
 ('__dir__', False),
 ('__doc__', False),
 ('__eq__', False),
 ('__format__', False),
 ('__ge__', False),
 ('__getattribute__', False),
 ('__gt__', False),
 ('__hash__', False),
 ('__init__', True),
 ('__init_subclass__', False),
 ('__le__', False),
 ('__lt__', False),
 ('__module__', False),
 ('__ne__', False),
 ('__new__', False),
 ('__reduce__', False),
 ('__reduce_ex__', False),
 ('__repr__', False),
 ('__setattr__', False),
 ('__sizeof__', False),
 ('__str__', True),              # <<<<<<<<<<
 ('__subclasshook__', False),
 ('__weakref__', False),
 ('_callable_field', False),     # <<<<<<<<<<
 ('_field', False),              # <<<<<<<<<<
 ('another_method', True),       # <<<<<<<<<<
 ('my_method', True),            # <<<<<<<<<<
 ('my_static_method', True)]     # <<<<<<<<<<
Note that this won't print True for builtin methods that are not explicitly defined in the class definition (or attached later, see __str__ and another_method above). Note, also, that unlike testing for callable, this actually catches the distinction between methods and callable attributes.
 
    
    
        GPhilo
        
- 18,519
- 9
- 63
- 89
- 
                    "Note that this only prints True for attributes that are explicitly defined in the class definition" not true, consider, `A.another_method = lambda self: None` – juanpa.arrivillaga Jul 27 '20 at 12:35
- 
                    @juanpa.arrivillaga Good point. What I'm trying to say is, builtin methods won't be marked as such, only those explicitly `def`ined (such as `__init__`) are marked as `True`. Dunno how to word that differently though. – GPhilo Jul 27 '20 at 12:38
- 
                    
