Python在初始化时继承

2024-09-27 21:28:30 发布

您现在位置: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(' ')

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

稍后我还会在cnc文件中看到FanucFile/okuma文件,我不确定这是我想要的。你知道吗

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

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

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

谢谢你的建议。你知道吗


Tags: nameself机器targetreturndefmachinefile
1条回答
网友
1楼 · 发布于 2024-09-27 21:28:30

我在你的例子中看不到任何继承。通常这将通过一个抽象基类或一个“接口”(如Java)来实现。您可以使用Python中的抽象基类模块来实现这一点。
https://docs.python.org/2/library/abc.html

您可以为加载文件保留一个公共方法名,然后尽可能地规范化文件的输出(即,用一个公共数据结构来表示相似的数据)。你知道吗

相关问题 更多 >

    热门问题