Python 插件的继承困境
Python inheritance dilemma for plugin
虽然这个问题是在Sublime Text插件的上下文中,但它实际上是一个关于Python面向对象设计的问题。
编写一个包含 2 个免费命令(具有一些共享功能)的 Sublime Text 插件让我陷入了 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
class:
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 CopyLine
class 中的 copy_line()
方法使用 sublime_plugin.TextCommand
class 中的方法] - 例如显示给 view.sel()
的调用 - 即使 CopyLine
class 没有继承 sublime_plugin.TextCommand
class.
在选项 2 中,CopyLine
class 继承了 sublime_plugin.TextCommand
class,尽管它实际上并不是一个插件。
以下哪个是更好的 OO 设计?有没有我应该使用的替代设计?
我已将两个选项的完整代码放在 GitHub Gist 中。
实施 r-stein 的建议通过使用非 OO 设计提供了解决插件继承困境的方法。
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
完整代码在 GitHub Gist 的 Option_3_CopyAndCutLine.py
中。
虽然这个问题是在Sublime Text插件的上下文中,但它实际上是一个关于Python面向对象设计的问题。
编写一个包含 2 个免费命令(具有一些共享功能)的 Sublime Text 插件让我陷入了 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
class:
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 CopyLine
class 中的 copy_line()
方法使用 sublime_plugin.TextCommand
class 中的方法] - 例如显示给 view.sel()
的调用 - 即使 CopyLine
class 没有继承 sublime_plugin.TextCommand
class.
在选项 2 中,CopyLine
class 继承了 sublime_plugin.TextCommand
class,尽管它实际上并不是一个插件。
以下哪个是更好的 OO 设计?有没有我应该使用的替代设计?
我已将两个选项的完整代码放在 GitHub Gist 中。
实施 r-stein 的建议通过使用非 OO 设计提供了解决插件继承困境的方法。
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
完整代码在 GitHub Gist 的 Option_3_CopyAndCutLine.py
中。