据我所知,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,我会使用一些静态类,或者只为这些类实现一个接口。关于如何让它看起来更干净,更符合逻辑的任何想法?
答案 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
类的问题。