我作为C#程序员工作了几个月,并习惯了 generics / templates 接口的概念,我可以将其传递给库,而无需关心对象是如何创建的。
我即将开始一个相对较大的项目,可能是在python中(我以前写了很多python,但主要是我自己的数据分析代码等),并且想知道是否存在类似的概念这种语言?我试过谷歌搜索它并没有提出太多。
如果答案是否定的,那很好,但在这种情况下,人们通常做什么呢?
答案 0 :(得分:17)
如果答案是否定的,那很好,但在这种情况下,人们通常做什么呢?
重要的是通过放弃C#的技术包袱来接近Python。
将Python学习为新语言。不要试图在Python和C#之间映射概念。那种方式就是疯狂。
“INTERFACES,不是泛型或模板”
没关系。所有静态类型声明技术都不是必需的。对于这个问题,类型转换也是不必要的。
答案 1 :(得分:5)
python是动态类型的,因此(在大多数情况下)不需要泛型/模板。
答案 2 :(得分:5)
我对接口的理解来自Java,所以希望它足够接近你的意思......
没有语法方法断言特定对象有一组方法和字段,因为Python使用dynamic typing / duck typing。如果要检查对象是否具有某个方法或字段,您可以:
__dict__
(所有的词典)中检查你想要的内容
对象的成员)。我认为MyObj.__dict__.hasKey(o)
是你想要的。 (很简单)在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)
但大多数人都不使用它。