接口隔离原则可以应用于Python对象吗?

Sim*_*one 7 python solid-principles interface-segregation-principle

为了将SOLID原则应用于有机增长且需要重新分解的Python项目,我试图理解接口隔离原理如何应用于Python语言,当接口不存在时语言功能?

dec*_*eze 11

接口是您可以在源代码中或在文档中非正式地键入提示的内容.Python 3支持函数注释,3.5 +实际类型提示,即使不存在所有类型提示,您仍然可以在文档中非正式地键入提示.类型提示只是说特定参数应具有特定的特征.

更具体地说:

interface Foo {
    string public function bar();
}

function baz(Foo obj) { .. }
Run Code Online (Sandbox Code Playgroud)

所有这一切都声明传入的参数baz应该是一个带有方法的对象,该方法bar不带参数并返回一个字符串.即使Python没有在语言级别实现任何东西来强制执行此操作,您仍然可以通过多种方式声明这些内容.

Python确实支持两个重要的事情:抽象类和多重继承.

而不是interface Foo在Python中你这样做:

import abc

class Foo(abc.ABC):
    @abc.abstractmethod
    def bar() -> str:
        pass
Run Code Online (Sandbox Code Playgroud)

而不是implements Foo,你做:

class MyClass(Foo):
    def bar() -> str:
        return 'string'
Run Code Online (Sandbox Code Playgroud)

而不是function baz(Foo obj),你做:

def baz(obj: Foo):
    obj.bar()
Run Code Online (Sandbox Code Playgroud)

由于具有多重继承功能,您可以根据需要精细地隔离接口/抽象类.

Python基于duck-typing原则,因此不是通过接口声明和继承强制执行所有这些,而是​​通常在"参数必须是可迭代的"等方面更松散地定义,并且调用者只需要确保参数是可迭代的.抽象类和函数注释与正确的开发工具相结合,可以帮助开发人员在各种执行级别上遵守此类合同.