Python 中 class 中的嵌套方法
Nested method in a class in Python
我正在使用一个名为 CVX 的优化软件包。它具有这些采用 CVX 表达式并构建新的 CVX 表达式的“原子”。一个例子是 trace 原子计算矩阵的迹。
我想我需要如下代码来创建一个 CVX 变量(一个 n x n 矩阵)并计算它的轨迹
X = cvxpy.Variable((n,n))
tr = cvxpy.atoms.affine.trace.trace(X)
这确实有效,但同样有效的只是
X = cvxpy.Variable((n,n))
tr = cvxpy.trace(X)
为什么第二个选项有效?一般来说,当有一个 class 嵌套方法时,我如何能够直接在 Python 中调用内部方法?
我不会概括这种行为。几乎可以肯定这是设计使然。可能 lib 开发人员不想在跟踪层次结构时如此冗长,所以给了你这个快捷方式。也有可能(很可能)直接针对 cvxpy 对象的 .trace 正在对该对象本身进行操作,而更深层次的对象正在对 cvxpy.atoms.affine.trace 对象进行操作。
要非常小心,因为副作用可能不一样。
为了非常直接地回答你的问题,我建议第二个选项可行,因为有人认为 API 更容易或者它恰好按照你期望的方式工作。
关于你的第二个问题:嵌套方法不是问题。有一个名为 atoms 的 cvxpy 对象的 属性,它又具有一个名为 affine 的 属性,它有一个名为 trace 的方法。
我正在使用一个名为 CVX 的优化软件包。它具有这些采用 CVX 表达式并构建新的 CVX 表达式的“原子”。一个例子是 trace 原子计算矩阵的迹。
我想我需要如下代码来创建一个 CVX 变量(一个 n x n 矩阵)并计算它的轨迹
X = cvxpy.Variable((n,n))
tr = cvxpy.atoms.affine.trace.trace(X)
这确实有效,但同样有效的只是
X = cvxpy.Variable((n,n))
tr = cvxpy.trace(X)
为什么第二个选项有效?一般来说,当有一个 class 嵌套方法时,我如何能够直接在 Python 中调用内部方法?
我不会概括这种行为。几乎可以肯定这是设计使然。可能 lib 开发人员不想在跟踪层次结构时如此冗长,所以给了你这个快捷方式。也有可能(很可能)直接针对 cvxpy 对象的 .trace 正在对该对象本身进行操作,而更深层次的对象正在对 cvxpy.atoms.affine.trace 对象进行操作。
要非常小心,因为副作用可能不一样。
为了非常直接地回答你的问题,我建议第二个选项可行,因为有人认为 API 更容易或者它恰好按照你期望的方式工作。
关于你的第二个问题:嵌套方法不是问题。有一个名为 atoms 的 cvxpy 对象的 属性,它又具有一个名为 affine 的 属性,它有一个名为 trace 的方法。