Python继承于初始化

时间:2017-12-31 18:33:13

标签: python class inheritance initialization g-code

我试图在初始化时根据用户在创建时请求的内容继承来自不同类的例程。我的示例是用于读取/操作/保存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(),元类吗?

感谢您的任何建议。

1 个答案:

答案 0 :(得分:0)

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

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