Как определить класс и перебрать его в Python? - PullRequest
0 голосов
/ 17 апреля 2019

Предположим, у меня есть два массива, которые могут выглядеть примерно так:

import numpy as np

theta_a = np.array([[-4.0, -3.8, -3.9, -4.0, -4.0, -4.0, -5.0, -6.0, -8.0, -10.0], 
                    [-4.1, -3.9, -3.8, -4.1, -4.0, -4.2, -4.8, -6.2, -8.1, -10.1], 
                    [-3.9, -3.6, -3.7, -3.8, -4.1, -4.0, -4.9, -6.0, -8.2, -9.90]])
theta_b = np.array([[-0.5, -0.6, -0.5, -0.5, -0.7, -0.6, -0.9, -1.0, -1.1, -6.0], 
                    [-0.4, -0.9, -0.8, -0.6, -0.7, -0.8, -1.0, -1.0, -1.1, -6.1], 
                    [-0.4, -0.7, -0.7, -0.8, -0.8, -0.7, -0.9, -1.1, -1.2, -5.9]])

Я хотел бы выполнить итерацию над этими списками, и я могу сделать это с помощью

d_theta_zip = [b - a for a, b in zip(theta_a, theta_b)]
f_theta_zip = np.tan(np.deg2rad(d_theta_zip))

Однако, ради любопытства (мне еще предстоит погрузиться в мир классов), а также немного очистить свой код, я бы хотел определить class, который точно так же

class Tester:
    def __init__(self, a, b):
        self.a = a
        self.b = b
    def __call__(self):
        d_theta = self.b - self.a
        f_theta = np.tan(np.deg2rad(d_theta))
        return f_theta

Это прекрасно работает, как только я настрою это

test = Tester(theta_a[0][0], theta_b[0][0])

, что дает тот же результат, что и

print(f_theta_zip[0][0])

При этом я не могу понять,способ перебрать класс, используя что-то вроде

test_2 = [Tester(a, b) for a, b in zip(theta_a, theta_b)]

, и я получаю следующее сообщение об ошибке

TypeError: 'list' object is not callable
  • Есть ли элегантный способ сделать это, используяclass?

Как я уже сказал, я делаю это как упражнение, чтобы лучше узнать систему class.

1 Ответ

3 голосов
/ 17 апреля 2019

Похоже, что вы делаете test_2() для вызова Tester.__call__, но вместо этого вам нужно ставить скобки после каждого экземпляра Tester здесь:

test_2 = [Tester(a, b)() for a, b in zip(theta_a, theta_b)]
print(test_2)  # [array([0.06116262, 0.05590868, 0.05941095, ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...