gpt4 book ai didi

python - 如何在 Python 中设计代码?

转载 作者:IT老高 更新时间:2023-10-28 20:26:23 26 4
gpt4 key购买 nike

我来自 Java 并学习 Python。到目前为止,我发现非常酷但很难适应的是不需要声明类型。我知道每个变量都是一个指向对象的指针,但到目前为止我还无法理解如何设计我的代码。

例如,我正在编写一个接受 2D NumPy 的函数大批。然后在函数体中,我调用了这个数组的不同方法(它是 Numpy 中 array 的一个对象)。但是将来假设我想使用这个函数,到那时我可能已经完全忘记了我应该将什么作为类型传递给函数。人们通常会做什么?他们只是为此编写文档吗?因为如果是这样的话,那么这涉及更多的类型,并且会提出关于不声明类型的想法的问题。

另外假设我想在将来传递一个类似于数组的对象。通常在 Java 中,一个人会实现一个接口(interface),然后让两个类来实现这些方法。然后在函数参数中,我将变量定义为接口(interface)的类型。这个问题如何在 Python 中解决,或者可以使用哪些方法来实现相同的想法?

最佳答案

这是一个非常健康的问题。

鸭子打字

首先要了解python是duck typing的概念:

If it walks like a duck, and quacks like a duck, then I call it a duck

与 Java 不同,Python 的类型从不显式声明。无论是在编译时还是在运行时,对象可以采用的类型都没有限制。

您所做的只是将对象视为满足您的需求的完美类型。你不会询问或怀疑它的类型。如果它实现了您希望它具有的方法和属性,那么就是这样。会的。

def foo(duck):
duck.walk()
duck.quack()

这个函数的唯一合约是duck暴露 walk()quack() .一个更精致的例子:

def foo(sequence):
for item in sequence:
print item

什么是sequence ?一个 list ?一个 numpy array ?一个 dict ?一个 generator ?没关系。如果它是可迭代的(也就是说,它可以在 for ... in 中使用),它就达到了它的目的。

类型提示

当然,没有人可以一直担心对象类型错误。这可以通过编码风格、约定和良好的文档来解决。例如:

  • 名为 count 的变量应该是一个整数
  • 一个变量Foo以大写字母开头的应该是 type ( class )
  • 参数 bar其默认值为 False , 应该持有 bool被覆盖时也是如此

请注意,鸭子类型的概念可以应用于以下 3 个示例:

  • count可以是任何实现 + 的对象, - , 和 <
  • Foo可以是任何返回对象实例的可调用对象
  • bar可以是任何实现 __nonzero__ 的对象

换句话说,类型从未明确定义,但总是强烈暗示。或者更确切地说,对象的功能总是被暗示,它的确切类型并不相关。

使用未知类型的对象是很常见的。大多数框架公开的类型看起来像列表和字典,但实际上并非如此。

最后,如果你真的需要知道,这里有文档。您会发现 Python 文档远远优于 Java。永远值得一读。

关于python - 如何在 Python 中设计代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22128123/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com