Python有C#/ Java风格的接口吗?

时间:2011-09-27 16:21:00

标签: python oop

我作为C#程序员工作了几个月,并习惯了 generics / templates 接口的概念,我可以将其传递给库,而无需关心对象是如何创建的。

我即将开始一个相对较大的项目,可能是在python中(我以前写了很多python,但主要是我自己的数据分析代码等),并且想知道是否存在类似的概念这种语言?我试过谷歌搜索它并没有提出太多。

如果答案是否定的,那很好,但在这种情况下,人们通常做什么呢?

5 个答案:

答案 0 :(得分:17)

  

如果答案是否定的,那很好,但在这种情况下,人们通常做什么呢?

Duck Typing

重要的是通过放弃C#的技术包袱来接近Python。

将Python学习为语言。不要试图在Python和C#之间映射概念。那种方式就是疯狂。


  

“INTERFACES,不是泛型或模板”

没关系。所有静态类型声明技术都不是必需的。对于这个问题,类型转换也是不必要的。

答案 1 :(得分:5)

python是动态类型的,因此(在大多数情况下)不需要泛型/模板。

答案 2 :(得分:5)

我对接口的理解来自Java,所以希望它足够接近你的意思......

没有语法方法断言特定对象有一组方法和字段,因为Python使用dynamic typing / duck typing。如果要检查对象是否具有某个方法或字段,您可以:

  • Dig into it with reflection(这是最多的工作)
  • __dict__(所有的词典)中检查你想要的内容 对象的成员)。我认为MyObj.__dict__.hasKey(o)是你想要的。 (很简单)
  • 只需使用该对象并相信您,您的开发人员或您的用户已经为您提供了适当的对象。 (最容易,但很危险)
  • 或者,执行上述操作并将其包装在try / except块中。 (这对Java程序员来说很熟悉)

在Python中设计一组复杂的类与使用C语言进行相同的体验是非常不同的,所以要做好你可能感到不舒服的事情(如上面的选项3)。祝你好运!

答案 3 :(得分:4)

如果你严格谈论C#/类Java接口,那么答案很简单。它们是属于静态类型语言的概念,并不真正适用于Python等动态语言。

通常的pythonic方法是信任你得到的对象,并假设它们具有你需要的必要特征。如果他们不这样做,您可能会发现可以处理或留给调用者的运行时错误。这与语言的一般动态性质相匹配:如果出现问题,您可以预期它会在运行时出现。

另一方面,来自Java或C#的接口是在编译期间检查必要的前提条件(即具有某些方法的对象)的方法。这(可以说)折衷了一些运行时灵活性,以提高编译时检查的安全性。

请注意,这并不意味着任何接口概念在动态类型语言中没有位置。事实上,Python有一个稍微模糊的“元类型”概念 - 例如迭代 - 经常被检查,例如,通过验证特定方法的存在:

def process_sequence(seq):
    if not hasattr(seq, '__iter__'):
        seq = [seq] # turn single element into iterable
    for elem in seq:
        process_element(elem)

这在概念上类似于Go语言的非清单接口。如果你想拥有自己的iterable,你只需实现__iter__方法 - 没有明确说明实现它(如在Java中,你将继承List类)。如果有人想要检查您的对象是否确实是可迭代的,他们可以验证是否确实满足了“合同” - 即具有__iter__方法。这就是andronikus在他们的回答中所描述的。

作为一个无耻的插件,我可以指出我正在实施的pyduck库。它旨在简化(甚至可能是标准化)对此类“合同”的验证(通过反思)并使其更加可靠。

答案 4 :(得分:3)

zope.interface

但大多数人都不使用它。