插件

时间:2016-05-26 13:00:00

标签: python inheritance sublime-text-plugin

虽然这个问题是在Sublime Text插件的上下文中,但它实际上是一个关于Python面向对象设计的问题。

编写Sublime Text插件,其中包含2个补充命令(具有一些共享功能),这使我陷入了Python继承困境。两种选择都非常有效 - 我只是不确定哪种OO设计更好。

选项1 - 插件命令使用多重继承:

import sublime, sublime_plugin

class CopyLine():
    def copy_line(self):
        sels = self.view.sel()
        # Do some stuff
        return line_region

class CopyLineCommand(sublime_plugin.TextCommand, CopyLine):
    def run(self, edit):
        line_region = self.copy_line()
        # Do some stuff

class CutLineCommand(sublime_plugin.TextCommand, CopyLine):
    def run(self, edit):
        line_region = self.copy_line()
        # Do some stuff

选项2 - 插件命令从其父级继承插件TextCommand类:

import sublime, sublime_plugin

class CopyLine(sublime_plugin.TextCommand):
    def copy_line(self):
        sels = self.view.sel()
        # Do some stuff
        return line_region

class CopyLineCommand(CopyLine):
    def run(self, edit):
        line_region = self.copy_line()
        # Do some stuff

class CutLineCommand(CopyLine):
    def run(self, edit):
        line_region = self.copy_line()
        # Do some stuff

这两个选项都有一个让我有点不安的方面:

选项1 中,copy_line()类中的CopyLine方法使用sublime_plugin.TextCommand类中的方法 - 例如显示给view.sel()的调用 - 即使CopyLine类没有继承sublime_plugin.TextCommand类。

选项2 中,CopyLine类继承sublime_plugin.TextCommand类,即使它实际上不是插件。

哪些是更好的OO设计?我应该使用替代设计吗?

我已将这两个选项的完整代码放在GitHub Gist

1 个答案:

答案 0 :(得分:0)

实现r-stein的建议通过使用非OO设计提供了插件继承困境的解决方案。

job_main:
   type: deploy
   script:
     - cp -r . /var/www/myapp/submodules/$CI_BUILD_REF
     - ln -s ./$CI_BUILD_REF /var/www/myapp/submodules/templink
     - mv -Tf /var/www/myapp/submodules/templink /var/www/myapp/submodules/frontend-templates

完整代码位于此GitHub Gistimport sublime, sublime_plugin def copy_line(view): sels = view.sel() # Do some stuff return line_region class CopyLineCommand(sublime_plugin.TextCommand): def run(self, edit): line_region = copy_line(self.view) # Do some stuff class CutLineCommand(sublime_plugin.TextCommand): def run(self, edit): line_region = copy_line(self.view) # Do some stuff