类和模块方法的 Pythonic 使用

标签 python methods coding-style code-readability

我想这是一个初学者的问题,但我想知道当您遇到使用模块中定义的类中的类方法的情况时,要使用更Pythonic的方法,例如以及模块本身定义的方法。我将使用 numpy 作为示例。

import numpy as np

foo = np.matrix([[3, 4], [9, 12]])

# Get norm (without using linalg)
norm = np.sqrt(foo.dot(foo.T)).diagonal()

我可以使用混合情况,就像这样,我调用 foo 的方法和 numpy 中定义的方法,或者我可以编写如下代码:

norm = np.diagonal(np.sqrt(np.dot(foo, foo.T)))

我自己更喜欢使用 foo.bar.baz.shoop.doop 语法,但在这种情况下我不能,因为 sqrt 不是 foo 的方法。那么,编写这样一行代码的更 Pythonic 方式是什么?

顺便问一下,与模块中定义的方法相比,类方法通常是否更优化?我不太明白幕后发生的事情,但我假设(再次使用 numpy 作为示例)numpy 有一个 np.dot 方法,该方法是为 arg 可以是数组或矩阵的一般情况编写的,而 np.matrix.dot 仅针对矩阵运算进行了重新实现和优化。如果我的理解有误,请纠正我。

最佳答案

您所问的问题实际上没有答案,因为您所问的案例根本不存在。

通常,在 Python 中,您没有相同的函数可用作方法和全局函数。

NumPy 是一种特殊情况,因为一些(但不是全部)顶级函数也可用作适当对象上的方法。即使如此,它们通常也不具有相同的语义,因此答案不是风格问题,而是哪个是正确的功能。

例如,在您的情况下,您唯一可以选择的是对角线。这两个选项给出了不同的结果。

>>> m = matrix([[1,2,3], [4,5,6], [7,8,9]]
>>> np.diagonal(m)
array([1, 5, 9])
>>> m.diagonal()
matrix([[1, 5, 9]])

模块函数接受形状为 (N, N) 的二维数组并返回形状为 (N,) 的一维数组。该方法采用形状为 (N, N) 的二维矩阵并返回形状为 (1, N) 的二维矩阵。

matrix 方法可能会更快。但这并不重要,重要的是如果其中一个是正确的,另一个就是错误的。这就像问 +* 是否是两个数字相乘的更快方法。无论 + 是否比 * 更快,它都不是更快的乘法方式,因为它不会相乘。

关于类和模块方法的 Pythonic 使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17606187/

相关文章:

python - 如何将 python datetime.datetime 转换为 excel 序列号

python - 在 Windows 8 中编译 mod_wsgi 不适用于 django

ruby - 数组初始化和方法计数增加 ?秘诀是什么?

c# - 抑制 TryParse 调用的静态代码分析警告 CA1806

java - 通过服务器或通过 JavaScript 注入(inject) HTML 哪个更好?

python - `if something` 还是 `if something is not None` ?

Python 与 Iron Python

python - 生成所有 Euler Bricks

Python:当从另一个类中调用初始方法时,类方法调用其他类方法

java - 无法使用java中另一个类的公共(public)方法