虽然这个问题是在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。
中答案 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 Gist的import 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
。