将用下面的例子来解释。你知道吗
现有python文件(a.py)包含一个类:
class A:
def method1(self, par1, par2='e'):
# some code here
pass
def method2(self, parA):
# some code here
pass
def method3(self, a, b, c):
# lots of code here
pass
def anothermethod(self):
pass
if __name__ == '__main__':
A().anothermethod()
现在,需要创建另一个py文件(b.py),该文件将包含类a的子类(类b)。 而且需要包含所有的方法(都是从父类继承的),但不包括 信息技术的实施。结果可能如下所示:
class B(A):
def method1(self, par1, par2='e'):
# empty here; ready to override
pass
def method2(self, parA):
# empty here; ready to override
pass
def method3(self, a, b, c):
# empty here; ready to override
pass
def anothermethod(self):
# empty here; ready to override
pass
if __name__ == '__main__':
B().anothermethod()
在描述了这个示例之后,问题是:如何生成最后提到的(类似骨架的)py文件?因此,在生成之后,您可以打开生成的文件并立即开始填充特定的实现。你知道吗
必须有一个较短的方法,1-2行解决方案。也许它已经被Python(python3)提供的模块中的一些现有功能解决了?
编辑(2018年3月14日)。谢谢https://stackoverflow.com/a/49152537/4958287(尽管我们在这里寻找简短的、已经存在的解决方案)。现在必须用更长的解决方案来解决这个问题——这里将包括它的粗略版本,也许它会对其他人有所帮助:
import inspect
from a import A
def construct_skeleton_subclass_from_parent(subcl_name, parent_cl_obj):
"""
subcl_name : str
Name for subclass and
file to be generated.
parent_cl_obj : obj (of any class to create subclass for)
Object of parent class.
"""
lines = []
subcl_name = subcl_name.capitalize()
parent_cl_module_name = parent_cl_obj.__class__.__module__
parent_cl_name = parent_cl_obj.__class__.__name__
lines.append('from {} import {}'.format(parent_cl_module_name, parent_cl_name))
lines.append('')
lines.append('class {}({}):'.format(subcl_name, parent_cl_name))
for name, method in inspect.getmembers(parent_cl_obj, predicate=inspect.ismethod):
args = inspect.signature(method)
args_others = str(args).strip('()').strip()
if len(args_others) == 0:
lines.append(' def {}(self):'.format(name))
else:
lines.append(' def {}(self, {}):'.format(name, str(args).strip('()')))
lines.append(' pass')
lines.append('')
#...
#lines.append('if __name__ == \'__main__\':')
#lines.append(' ' + subcl_name + '().anothermethod()')
#...
with open(subcl_name.lower() + '.py', 'w') as f:
for c in lines:
f.write(c + '\n')
a_obj = A()
construct_skeleton_subclass_from_parent('B', a_obj)
使用
inspect
模块获取方法及其每个签名的列表:相关问题 更多 >
编程相关推荐