寻找一种生成子类(将被创建到一个新文件中)的简单方法,其中包含父类的方法(Python)

2024-04-19 23:01:44 发布

您现在位置:Python中文网/ 问答频道 /正文

将用下面的例子来解释。你知道吗

现有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)

Tags: 文件tonamepyselfobjherecl
1条回答
网友
1楼 · 发布于 2024-04-19 23:01:44

使用inspect模块获取方法及其每个签名的列表:

import a
import inspect

for name, method in inspect.getmembers(a.A, predicate=inspect.ismethod):
    args = inspect.signature(method)
    print("    def {}({}):".format(name, args))
    print("        pass")
    print()

相关问题 更多 >