在Python中实现接口?

时间:2014-08-06 12:18:49

标签: python class methods interface

据我所知,Python没有明确的内置功能允许实现接口。请考虑以下情况:

我有一个包含多个类的项目。其中一些使用特定的方法。这种方法在功能上或逻辑上与它们中的任何一种都不一致,并且在技术上永远不应该出现在那里,更不用说它是相同的方法,并且在所有这些中复制和粘贴它绝对是一种不好的做法。类。现在我可以创建一个类,并让所有这些类继承它,所以他们可以使用这个方法......但是再一次,这些类彼此之间没有任何共同之处,对于他们来说,拥有一个共同点是愚蠢的。超类。我可以使用此方法创建一个单独的类,将其实例作为参数传递到任何地方,然后将该方法作为成员函数调用,但这也看起来像一个脏动作,我真的希望以最优雅的方式执行此操作

我认为在此处粘贴所有这些代码以强调问题是没有用的,我将使用一个专注于我想要的简化模型:

class 1():
    def class1_specific_method (self):
        common_method() 
    def common_method()
        #some code
        return
class 2():
    def class2_specific_method (self):
        common_method() 
    def common_method()
        #some code
        return

common_method的工作方式完全相同,在两种情况下都是必需的,但与这些类中的任何一种都没有关系。通常,如果它是Java,我会使用一些静态类,或者只为这些类实现一个接口。关于如何让它看起来更干净,更符合逻辑的任何想法?

3 个答案:

答案 0 :(得分:2)

为什么不把它变成顶级功能呢?如果你选择忽略Python带给你的所有东西,比如Java(模块,顶级/一流函数,鸭子打字),当然缺少接口似乎不方便。

class 1():
    def class1_specific_method (self):
        common_method(self) 
class 2():
    def class2_specific_method (self):
        common_method(self) 

def common_method(obj)
    #some code
    return

答案 1 :(得分:1)

Interfaces的替代方法是使用ABC模块中的Abstract Classes。使用它你可以:

from abc import ABCMeta
class AbstractClass(object):
   __metaclass__ = abc.ABCMeta
   def CommonMethod(self):
       print "Common Method for all subclasses!"
...
class MyClass(AbstractClass):
    pass

>>> obj = MyClass()
>>> obj.CommonMethod()
Common Method for all subclasses!

现在你有了一个抽象类,你的类可以从中继承常见的行为。如果您想拥有多个接口,可以使用ABC继承多个继承。

但是,Python中的多重继承应该首先对接口的需求无用(理论上就是这样)。在某些情况下,ABCMeta可以提供类似于和接口的机制,但它也感觉你正在扩展语言。

TL; DR: Python中没有接口。 ABC可以提供一份工作。

编辑:还有zope.interface,但我不熟悉它的用法。

答案 2 :(得分:0)

我没有看到使用继承的问题,python不是java。我的意思是,python有多重继承,它对于功能类似于java接口的mixin很有用。例如,如果您从类Class0继承,则按如下方式解决问题:

class Class0(object):
    ...

class Class1(Class0, CommonMethodsMixin):
    def class1_specific_method (self):
        common_method() 

class Class2(Class0, CommonMethodsMixin):
    def class2_specific_method (self):
        common_method() 

class CommonMethodsMixin(object):
    def common_method():
        ...

鉴于您没有任何Class0我没有看到仅仅继承CommonMethodsMixin类的问题。