import inspect, sys filter_is = [a for a in dir(inspect) if a.startswith('is')] class B: Z = range(4) def attr(self, a: [Z, Z.__class__.__name__], z, *args, x=Z, y='y5', **kwargs): pass class A(B): def __init__(self): self.Y = 1, 2, 3 @classmethod def attr2(cls: object) -> str: pass @staticmethod def attr1(): pass c = A() a = c.__class__ print(inspect.classify_class_attrs(a)) print(inspect.getclasstree(inspect.getmro(a))) print(inspect.getmembers(с)) for an in dir(c): if not an.startswith('_'): ga = getattr(c, an) print('-' * 20) print(dict(name=an, type=type(ga), id=id(ga), len=len(ga) if hasattr(ga, '__len__') else None, getsizeof=sys.getsizeof(ga), getrefcount=sys.getrefcount(ga))) print({k: getattr(inspect, k)(ga) for k in filter_is}) print(ga) if callable(ga): print(inspect.getsource(ga)) print(inspect.getfullargspec(ga)) print(inspect.formatargspec(*inspect.getfullargspec(ga)))
out:
Attribute(name='Z', kind='data', defining_class=<class '__main__.B'>, object=range(0, 4)), Attribute(name='__class__', kind='data', defining_class=... [(<class 'object'>, ()), [(<class '__main__.B'>, (<class 'object'>,)), [(<class '__main__.A'>, (<class '__main__.B'>,))]]] [('Y', (1, 2, 3)), ('Z', range(0, 4)), ('__class__', <class '__main__.A'>), ('__delattr__', <method-wrapper '__delattr__' of A object at 0x029C94B0>), ('__dict__', {'Y': (1, 2, 3)}),..... -------------------- {'type': <class 'tuple'>, 'name': 'Y', 'len': 3, 'getsizeof': 40, 'id': 9584592, 'getrefcount': 4} {'isclass': False, 'ismethod': False, 'istraceback': False, 'isabstract': False, 'ismethoddescriptor': False, 'isfunction': False, 'isgenerator': False, 'ismodule': False, 'isroutine': False, 'isdatadescriptor': False, 'iscode': False, 'isframe': False, 'isgetsetdescriptor': False, 'isgeneratorfunction': False, 'isbuiltin': False, 'ismemberdescriptor': False} (1, 2, 3) -------------------- {'type': <class 'range'>, 'name': 'Z', 'len': 4, 'getsizeof': 24, 'id': 9225184, 'getrefcount': 5} {'isclass': False, 'ismethod': False, 'istraceback': False, 'isabstract': False, 'ismethoddescriptor': False, 'isfunction': False, 'isgenerator': False, 'ismodule': False, 'isroutine': False, 'isdatadescriptor': False, 'iscode': False, 'isframe': False, 'isgetsetdescriptor': False, 'isgeneratorfunction': False, 'isbuiltin': False, 'ismemberdescriptor': False} range(0, 4) -------------------- {'type': <class 'method'>, 'name': 'attr', 'len': None, 'getsizeof': 36, 'id': 9017304, 'getrefcount': 2} {'isclass': False, 'ismethod': True, 'istraceback': False, 'isabstract': False, 'ismethoddescriptor': False, 'isfunction': False, 'isgenerator': False, 'ismodule': False, 'isroutine': True, 'isdatadescriptor': False, 'iscode': False, 'isframe': False, 'isgetsetdescriptor': False, 'isgeneratorfunction': False, 'isbuiltin': False, 'ismemberdescriptor': False} <bound method A.attr of <__main__.A object at 0x009394B0>> def attr(self, a: [Z, Z.__class__.__name__], z, *args, x=Z, y='y5', **kwargs): pass FullArgSpec(args=['self', 'a', 'z'], varargs='args', varkw='kwargs', defaults=None, kwonlyargs=['x', 'y'], kwonlydefaults={'y': 'y5', 'x': range(0, 4)}, annotations={'a': [range(0, 4), 'range']}) (self, a: [range(0, 4), 'range'], z, *args, x=range(0, 4), y='y5', **kwargs) -------------------- {'type': <class 'function'>, 'name': 'attr1', 'len': None, 'getsizeof': 72, 'id': 33140928, 'getrefcount': 3} {'isclass': False, 'ismethod': False, 'istraceback': False, 'isabstract': False, 'ismethoddescriptor': False, 'isfunction': True, 'isgenerator': False, 'ismodule': False, 'isroutine': True, 'isdatadescriptor': False, 'iscode': False, 'isframe': False, 'isgetsetdescriptor': False, 'isgeneratorfunction': False, 'isbuiltin': False, 'ismemberdescriptor': False} <function A.attr1 at 0x01F9B0C0> @staticmethod def attr1(): pass FullArgSpec(args=[], varargs=None, varkw=None, defaults=None, kwonlyargs=[], kwonlydefaults=None, annotations={}) () -------------------- {'type': <class 'method'>, 'name': 'attr2', 'len': None, 'getsizeof': 36, 'id': 9017304, 'getrefcount': 2} {'isclass': False, 'ismethod': True, 'istraceback': False, 'isabstract': False, 'ismethoddescriptor': False, 'isfunction': False, 'isgenerator': False, 'ismodule': False, 'isroutine': True, 'isdatadescriptor': False, 'iscode': False, 'isframe': False, 'isgetsetdescriptor': False, 'isgeneratorfunction': False, 'isbuiltin': False, 'ismemberdescriptor': False} <bound method type.attr2 of <class '__main__.A'>> @classmethod def attr2(cls: object) -> str: pass FullArgSpec(args=['cls'], varargs=None, varkw=None, defaults=None, kwonlyargs=[], kwonlydefaults=None, annotations={'cls': <class 'object'>, 'return': <class 'str'>}) (cls: object) -> str