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 GistOption_3_CopyAndCutLine.py 中。