gpt4 book ai didi

python - 基于其 MRO 创建类的扁平化表示

转载 作者:行者123 更新时间:2023-11-28 19:25:51 26 4
gpt4 key购买 nike

我将如何创建一个由多个基类/mixin 组成的类的扁平表示。有做这种事的图书馆吗?例如:

class Foo(object):
def a(self):
return

class Bar(object):
def b(self):
return

class Baz(Foo, Bar):
pass

我希望能够创建扁平化类的文本表示,如下所示:

class Baz(object):
def a(self):
return

def b(self):
return

我的想法是创建一个文本编辑器插件(在我的例子中是 ST2),以允许用户右键单击一个类名并选择一个选项以打开一个选项卡,其中显示扁平化的类以供引用。

当然,该工具需要足够智能,才能将 super 调用视为基本包含。

最佳答案

据我所知,大多数执行此操作的工具都是通过执行代码并询问定义的类来完成的。一个简单的实现可能是:

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____doc__,这个实现只是忽略它们。

关于python - 基于其 MRO 创建类的扁平化表示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13392291/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com