Pythonic使用类和模块方法

时间:2013-07-12 01:31:16

标签: 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仅针对矩阵运算重新实现和优化。如果我错了,请纠正我。

1 个答案:

答案 0 :(得分:1)

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

通常,在Python中,您没有与方法和全局函数相同的功能。

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

例如,在您的情况下,您唯一选择的是diagonal。这两个选项会产生不同的结果。

>>> 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)的2D数组并返回形状(N,)的1D数组。该方法采用形状(N,N)的二维矩阵,并返回形状(1,N)的二维矩阵。

matrix方法可能会更快。但这并不像其中一个是正确的,另一个是错的那样重要。这就像询问+*是否是一种更快的方式来乘以两个数字。 +是否比*更快,它不是一种更快的乘法方式,因为它不会成倍增加。