2011-09-27 17 views
6

我作为一名C#程序员工作了几个月,并习惯了 泛型/模板 接口的想法,我可以将这些接口传递给库,而不必关心对象是如何创建的。我打算开始一个相对较大的项目,可能在python(我以前写过很多python,但大部分是我自己的数据分析代码等),并且想知道是否存在类似的概念在这种语言?我尝试过使用Google搜索,而不是拿出很多。Python是否有C#/ Java风格的接口?

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

+0

我不确定你在找什么。模板和泛型是完全不同的东西(你的意思是像T4模板吗?)你可以给你一些你想在Python中做什么的C#示例吗? – Davy8

+0

我想说OP代表C/C++模板,Java/C#泛型的最初灵感 –

+0

虽然C++模板远不止泛型,但如果OP讨论C++模板,这将使下面的答案失效。我不这么认为,因为只提到了C#,而“模板/泛型”这个措词表明OP没有真正意识到这种差异。 – delnan

回答

5

我的理解接口是从Java,所以希望这是足够接近你的意思......

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

  • Dig into it with reflection(这是最工作)
  • 检查要在其__dict__(一所有的字典什么 对象的成员)。 MyObj.__dict__.hasKey(o)是你想要的,我想。 (非常容易)
  • 只需使用该对象并相信您,您的开发人员或您的用户给了您适当的对象。 (最大容易,但危险)
  • 或者,执行上述操作并将其包装在try/except块中。 (这将是熟悉的Java程序员)

设计了一套复杂的Python类是在做类似C语言一样非常不同的经历,所以准备做的事情,你是不舒服(像上面的选项3一样)。祝你好运!

+0

谢谢 - 我知道选项3对我来说可用,但如果我能说服其他团队成员不使用它,我会尝试:) 其余部分也很有用。谢谢! – samb8s

+0

大概是个好主意,是的。我在我的个人资料中做了很多,但如果我做错了,没有人会死亡或赔钱。 – andronikus

5

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

15

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

Duck Typing

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

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


“接口,而不是仿制药,或模板”

无所谓。所有这些静态类型声明技术是没有必要的。就此而言,为了打破规则而进行类型转换也是不必要的。

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语言的非清单接口。如果你想拥有自己的迭代器,你只需要实现__iter__方法 - 没有明确地说明你会执行它(如在Java中,你将继承List类)。如果有人想检查你的对象是否确实是一个可迭代的对象,他们可以验证是否确实满足了“合同” - 即具有__iter__方法。这是安隆尼库斯在他们的答案中所描述的。

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