Python在初始化时继承

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python在初始化时继承相关的知识,希望对你有一定的参考价值。

我试图在初始化时根据用户在创建时请求的内容继承不同类中的例程。我的示例是用于读取/操作/保存g代码文本文件的CNCFile类。当它被创建时,用户输入目标机器的类型(Fanuc,Okuma,Mitsubishi等)。由于所有这些机器都有不同的方法来处理文件中的子程序名和子调用,我需要为每台机器编写单独的类/函数。

以下是执行我想要的代码示例。它看起来很乱。

class FanucFile(object):
    def __init__(self):
        print('Fanuc file type')

    def subnames(self):
        alist = ['0001', '0002', '0003']
        return alist

    def subcalls(self):
        alist = ['M98 P0002', 'M98 P0003']
        return alist

class OkumaFile(object):
    def __init__(self):
        print('Okuma file type')

    def subnames(self):
        alist = ['MAIN', 'SUB1', 'SUB2']
        return alist

    def subcalls(self):
        alist = ['CALL SUB1', 'CALL SUB2']
        return alist

class CNCFile(object):
    def __init__(self, target_machine = 'Fanuc', file_name=None):

        if target_machine == 'Fanuc':
            self.file = FanucFile()

        elif target_machine == 'Okuma':
            self.file = OkumaFile()

        if file_name <> None:
            self.getfile(file_name)
            self.filename = file_name

    def getfile(self, name):
        '''Reads file into list'''
        self.filecont = ['%(Test.cnc)', 
                         'O0001(PART MAIN)', 
                         'N1', 
                         'G00 G17 G20 G40', 
                         'M98 P0002', 
                         'M30', 
                         ' ', 
                         'O0002(SUB 2)', 
                         'M98 P0003', 
                         'M99', 
                         ' ', 
                         'O0003(SUB 2)', 
                         'G91 G28 Z0.', 
                         'M99', 
                         '%']

    def subnames(self): # wrapper around .file.subnames() - seems dumb
        return self.file.subnames()

    def subcalls(self): # wrapper around .file.subcalls() - seems dumb
        return self.file.subcalls()

    def savefile(self):
        for aline in self.filecont:
            print(aline)


if __name__=='__main__':
    #just for testing

    a = CNCFile(target_machine = 'Fanuc', file_name = 'Test.cnc')
    print('File Name : ' + a.filename)
    print('Subs found: ' + str(a.subnames()))
    print('Sub calls : ' + str(a.subcalls()))
    print('Save File :')
    a.savefile()
    print(' ')

我最终不得不围绕目标机器的例程编写一个包装函数,这看起来很尴尬。

我之后也会在CNCFile中看到FanucFile / OkumaFile,我不确定这是我想要的。

a = CNCFile(target_machine = 'Fanuc', file_name = 'Test.cnc')
a.subnames()
a.file.subnames()   # redundant

我尝试将CNCFile调用继承到FanucFile或OkumaFile类,但是当在FanucFile或OkumaFile类持有大量数据时在CNCFile中编写savefile例程时,它变得很乱。

我应该看看super(),meta类吗?

谢谢你的任何建议。

答案

我的示例中没有看到任何继承。通常,这将通过抽象基类或“接口”(即类似Java)来完成。您可以使用Python中的Abstract Base Class模块来完成此任务。 https://docs.python.org/2/library/abc.html

您可以为加载文件留下一个通用的方法名称,然后尽可能地规范化文件的输出(即,表示类似数据的通用数据结构)。

以上是关于Python在初始化时继承的主要内容,如果未能解决你的问题,请参考以下文章

python继承关系及DVD案例

我想在每次选择底部导航项时初始化片段

Python-类继承

Python多继承时初始化父类的属性

python 子类继承父类__init__(转载)

python继承初始化对象实例时 TypeError: module() takes at most 2 arguments (3 given)