0

我试图根据用户在创建时的请求在初始化时从不同类继承例程。我的示例是用于读取/操作/保存 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 中编写保存文件例程时会变得混乱。

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

感谢您的任何建议。

4

1 回答 1

0

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

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

于 2017-12-31T18:40:42.523 回答