Q:

Переопределение в классе python(курсы)

Необходимо понять, в чем может быть ошибка данного кода, а точнее где, могут возникнуть "вопросы".
   def __mul__(self, alpha):
        if isinstance(alpha, Matrix):
            result = []
            numbers = []
            for i in range(len(self.lists)):
                for j in range(len(self.lists[0])):
                    numbers.append(int(alpha * self.lists[i][j]))
                    if len(numbers) == len(self.lists[0]):
                        result.append(numbers)
                        numbers = []
        else:
            result = []
            numbers = []
            for i in range(len(self.lists)):
                for j in range(len(self.lists[0])):
                    numbers.append(int(self.lists[i][j] * alpha))
                    if len(numbers) == len(self.lists[0]):
                        result.append(numbers)
                        numbers = []
        return Matrix(result)

    __rmul__ = __mul__

Использование этой части класса - верное, и результат верный.
Но проверяющая система ругается и выдает ошибку типа "Runtime error"
Отсюда вопрос, где я неверно или возможно неточно использую класс...
Полный код класса и требований ниже:
Класс:
from sys import stdin
from copy import deepcopy

class MatrixError(BaseException):
    def __init__(self, r1, other):
        self.matrix1 = r1
        self.matrix2 = other

class Matrix:
    def __init__(self, lists):
        self.lists = deepcopy(lists)

    def __str__(self):
        strRep = ""
        amount = 0
        for lists in self.lists:
            if amount != 0:
                strRep += "\n"
            new_str = "\t".join(str(elem) for elem in lists)
            strRep += new_str
            amount += 1
        return strRep

    def size(self):
        return len(self.lists), len(self.lists[0])

    def __add__(self, other):
        if len(self.lists) == len(other.lists):
            lenght = len(self.lists[0])
            for row in self.lists:
                if len(row) != lenght:
                    raise MatrixError(self, other)
            for row2 in other.lists:
                if len(row2) != lenght:
                    raise MatrixError(self, other)
            result = []
            numbers = []
            for i in range(len(self.lists)):
                for j in range(len(self.lists[0])):
                    summa = other.lists[i][j] + self.lists[i][j]
                    numbers.append(summa)
                    if len(numbers) == len(self.lists[0]):
                        result.append(numbers)
                        numbers = []
            return Matrix(result)
        else:
            raise MatrixError(self, other)

    def __mul__(self, alpha):
        if isinstance(alpha, Matrix):
            result = []
            numbers = []
            for i in range(len(self.lists)):
                for j in range(len(self.lists[0])):
                    numbers.append(int(alpha * self.lists[i][j]))
                    if len(numbers) == len(self.lists[0]):
                        result.append(numbers)
                        numbers = []
        else:
            result = []
            numbers = []
            for i in range(len(self.lists)):
                for j in range(len(self.lists[0])):
                    numbers.append(int(self.lists[i][j] * alpha))
                    if len(numbers) == len(self.lists[0]):
                        result.append(numbers)
                        numbers = []
        return Matrix(result)

    __rmul__ = __mul__

    def transpose(self):
        t_matrix = list(zip(*self.lists))
        self.lists = t_matrix
        return Matrix(t_matrix)

    def transposed(self):
        t_matrix = list(zip(*self.lists))
        return Matrix(t_matrix)

# Task 2 check 3
m = Matrix([[1, 1, 0], [0, 2, 10], [10, 15, 30]])
alpha = 15
print(m * alpha)
print(alpha * m)
#exec(stdin.read())

В конце как раз проверка.
Результат верный, но способ проверки - нет.
Условия задания:Реализуйте класс Matrix. Он должен содержать:
Конструктор от списка списков. 
Гарантируется, что списки состоят из чисел, не пусты и все имеют одинаковый размер. Конструктор должен копировать содержимое списка списков, т. е. при изменении списков, от которых была сконструирована матрица, содержимое матрицы изменяться не должно.
Метод str, переводящий матрицу в строку. При этом элементы внутри одной строки должны быть разделены знаками табуляции, а строки — переносами строк. После каждой строки не должно быть символа табуляции и в конце не должно быть переноса строки.
Метод size без аргументов, возвращающий кортеж вида (число строк, число столбцов).
add, принимающий вторую матрицу того же размера и возвращающий сумму матриц.
mul, принимающий число типа int или float и возвращающий матрицу, умноженную на скаляр.
rmul, делающий то же самое, что и mul. Этот метод будет вызван в том случае, аргумент находится справа. Для реализации этого метода в коде класса достаточно написать rmul = mul.
Иллюстрация:
В следующем случае вызовется mul: Matrix([[0, 1], [1, 0]) * 10.
В следующем случае вызовется rmul (так как у int не определен mul для матрицы справа): 10 * Matrix([[0, 1], [1, 0]).
Разумеется, данные методы не должны менять содержимое матрицы.
Добавьте в программу из предыдущей задачи класс MatrixError, содержащий внутри self поля matrix1 и matrix2 — ссылки на матрицы.
В класс Matrix внесите следующие изменения:
Добавьте в метод add проверку на ошибки в размере входных данных, чтобы при попытке сложить матрицы разных размеров было выброшено исключение MatrixError таким образом, чтобы matrix1 поле MatrixError стало первым аргументом add (просто self), а matrix2 — вторым (второй операнд для сложения).
Реализуйте метод transpose, транспонирующий матрицу и возвращающую результат (данный метод модифицирует экземпляр класса Matrix)
Реализуйте статический метод transposed, принимающий Matrix и возвращающий транспонированную матрицу
В общем, я потерян.

A:

Я немного упростил и чутка поправил ваш код. Например, критерий правильности аргументов в add& на мой взгляд, должен быть таким
if isinstance(other, Matrix) and self.size() == other.size():

весь код
class Matrix:
    def __init__(self, lists):
        self.lists = deepcopy(lists)

    def __str__(self):
        return '\n'.join(['\t'.join(map(str, row)) for row in self.lists])

    def size(self):
        return len(self.lists), len(self.lists[0])

    def __mul__(self, alpha):
        lst = [[ alpha * el for el in row] for row in self.lists]
        return Matrix(lst)

    __rmul__ = __mul__

    def transpose(self):
        self.lists = list(zip(*self.lists))
        return self

    @staticmethod
    def transposed(self):
        t_matrix = list(zip(*self.lists))
        return Matrix(t_matrix)

    def __add__(self, other):
        if isinstance(other, Matrix) and self.size() == other.size():
            return Matrix([[a+b for a,b in zip(x,y)] for x,y in zip(self.lists, other.lists)])
        else:
            raise MatrixError(self, other)

