AFAIK,大多数执行此操作的工具都是通过执行代码和询问定义的类来完成的。一个简单的实现可能是:
import inspect
import textwrap
def print_def(cls):
print('class %s:' % cls.__name__)
for name, member in inspect.getmembers(cls):
if not name.startswith('__') and member is not None:
source = inspect.getsource(member)
source = textwrap.dedent(source)
for l in source.split('\n'):
print(' %s' % l)
为了说明这一点,假设您正在查询的文件包含以下定义:
class A:
def a_method(self):
self.a = 4
return self.a
def overridden(self):
print('This is A')
class B:
def b_method(self):
print([1, 2, 3])
return 4
class C(A, B):
def c_method(self):
pass
def overridden(self):
print('This is C')
然后:
>>> vars = {}
>>> execfile('myfile.py', {}, vars)
>>> print_def(vars['C'])
class C:
def a_method(self):
self.a = 4
return self.a
def b_method(self):
print([1, 2, 3])
return 4
def c_method(self):
pass
def overridden(self):
print('This is C')
你需要决定你想让它对成员做什么,比如__repr__
and __doc__
,这个实现只是忽略它们。