Вот фрагмент, содержащий код, который воспроизводит мою ошибку. Почему функция sum передает экземпляр класса вместо числа в метод вычитания?
class my_class():
def __init__(self):
pass
def __subtract (x,y, n=1):
return (x - y)**n
def num_generator(self, num):
example_list = []
for idx in range(num):
example_list += [idx]
expression = {y: sum(self.__subtract(x, y) for x in example_list) for y in range(min(example_list), max(example_list) + 1)}
no_vals = max(expression.items(), key=operator.itemgetter(1))[0]
return no_vals
chosen_no = 20
class_instance = my_class()
class_instance.num_generator(chosen_no)
ОШИБКА:
TypeError: unsupported operand type(s) for -: 'my_class' and 'int'
Я смотрю на это уже 20 минут, и для меня это бессмысленно.
в:
def __subtract (x,y, n=1):
return (x - y)**n
поскольку __subtract
является методом экземпляра, x
представляет текущий объект в качестве первого аргумента (нет, self
не является ключевым словом).
Аргумент по умолчанию делает его необнаружимым, что объясняет, что python не жалуется на количество аргументов. Когда вы звоните:
self.__subtract(x, y)
в вызове вы смещаете все аргументы, а y
занимает n
аргумент по умолчанию:
def __subtract (yourobject => x, x => y, y => n):
Ваш метод не требует состояния объекта, поэтому просто добавьте декоратор @staticmethod
@staticmethod
def __subtract (x,y, n=1):
return (x - y)**n
как в сторону, замените громоздкий и нижеперечисленный код ниже:
example_list = []
for idx in range(num):
example_list += [idx]
от
example_list = list(range(num))
staticmethod
как рекомендует Жан-Франсуа. Дополнительная информация: stackoverflow.com/questions/136097/…