Вложенный метод в классе в Python - PullRequest
0 голосов
/ 06 августа 2020

Я использую программный пакет для оптимизации под названием CVX. У него есть эти «атомы», которые принимают выражение CVX и создают новое выражение CVX. Одним из примеров является атом след для вычисления следа матрицы.

Я думал, что мне понадобится код, как показано ниже, для создания переменной CVX (матрицы n на n) и вычисления ее следа

X = cvxpy.Variable((n,n))
tr = cvxpy.atoms.affine.trace.trace(X)

Это работает, но также работает просто

X = cvxpy.Variable((n,n))
tr = cvxpy.trace(X)

Почему работает второй вариант? В общем, когда есть класс с вложенными методами, как я могу вызвать внутренний метод непосредственно в Python?

1 Ответ

1 голос
/ 06 августа 2020

Я бы не стал обобщать поведение. Почти наверняка это сделано намеренно. Скорее всего, разработчики lib не хотели быть такими многословными при отслеживании иерархии, поэтому дали вам этот ярлык. Также возможно (очень вероятно), что .trace непосредственно против объекта cvxpy работает с этим объектом, тогда как более глубокий действует на объект cvxpy.atoms.affine.trace.

Будьте очень осторожны, потому что побочные эффекты могут быть разными.

Чтобы ответить на ваш вопрос очень прямо, я бы предположил, что второй вариант работает, потому что кто-то думал упростить свой API, ИЛИ он просто работает так, как вы ожидаете.

На ваш второй вопрос: вложенные методы не существуют. У объекта cvxpy есть свойство, называемое атомами, которое, в свою очередь, имеет свойство, называемое affine, которое имеет метод, называемый trace.

...