Ошибка максимальной глубины рекурсии при передаче списка методу __init __ () - PullRequest
0 голосов
/ 05 июля 2019

Я пытаюсь создать базовую среду математического программирования, что-то вроде мудреца, но очень базовую.Я определил класс functionClass и подкласс poly, который наследует атрибут functionClass.x от своего базового класса.

Метод базового класса poly __init__() принимает список (соответствующий коэффициентам многочлена) с именем coeffs, кроме использования functionClass '* x.

По какой-то странной причине я получаю сообщение RecursionError: maximum recursion depth exceeded при первом создании объекта.Я немного озадачен, потому что все это произошло в методе poly __init__() .... быстрый указатель был бы очень полезен!

Вот что у меня так далеко:

import math
import operator

class functionClass:

    functions = {0: math.sin, 1: math.cos, 2: math.tan, 3: math.exp, 4: 'identity'}


    def __init__(self,option_code=0,x=0):
        self._option_code = option_code
        self._x = x
    @property
    def code(self):
        return self._option_code
    @code.setter
    def code(self,new_code):
        self._option_code = new_code

    @property
    def x(self):
        return self._x
    @x.setter
    def x(self,new_x):
        self._x = new_x

    def f_x(self):
        if self.code in self.functions:
            return self.functions[self.code](self.x)

    def __add__(self,other):
        sum = self.f_x() + other.f_x()
        return sum

    def __sub__(self,other):
        difference = self.f_x() - other.f_x()
        return difference

    def __mul__(self,other): 
        product = self.f_x() * other.f_x()
        return product

    def __truediv__(self,other):
        quotient = self.f_x() / other.f_x()
        return quotient


#class poly(functionClass)-------------------------------------------------------------------------------------------------------
class poly(functionClass):
    def __init__(self,coeffs,x):
        self.coeffs = coeffs
        print(self.coeffs)
        self.degree = len(coeffs)
        functionClass.x = x


    @property
    def coeffs(self):
        return self.coeffs

    @coeffs.setter
    def coeffs(self,new_coeffs):#TAKES IN A LIST
        self.coeffs= new_coeffs


    #test this
    def p_x(self):
        sum = 0
        for i in range(self.degree):
            sum = sum + (self.coeffs[i] * math.pow(x,i))
        return sum

    def __add__(self,other):
        pass

    def __sub__(self,other):
        pass

    def __mul__(self,other):
        pass

Когда я запускаю i=poly([1,1,1],1), я получаю это:

Traceback (most recent call last):
  File "<pyshell#0>", line 1, in <module>
    i = poly([1,1,1],1)
  File "C:\Python\numInt.py", line 76, in __init__
    self.coeffs = coeffs
  File "C:\Python\numInt.py", line 88, in coeffs
    self.coeffs= new_coeffs
  File "C:\Python\numInt.py", line 88, in coeffs
    self.coeffs= new_coeffs
  File "C:\Python\numInt.py", line 88, in coeffs
    self.coeffs= new_coeffs
  [Previous line repeated 989 more times]
RecursionError: maximum recursion depth exceeded

Это не является частью какой-либо домашней работы или чего-то в этом роде, я просто работаю над улучшением своих навыков в Python.

Ответы [ 2 ]

1 голос
/ 05 июля 2019

Проблема заключается в установщике coeffs, взаимодействующем со строкой self.coeffs = coeffs в __init__

    @coeffs.setter
    def coeffs(self,new_coeffs):#TAKES IN A LIST
        self.coeffs= new_coeffs

Настройка coeffs вызывает установщик, но установщик устанавливает его снова внутри, вызываябесконечный цикл.Обычное (но не универсальное) соглашение заключается в добавлении «_» к имени вспомогательной переменной.Так что сделайте ваш сеттер:

    @coeffs.setter
    def coeffs(self,new_coeffs):#TAKES IN A LIST
        self.coeffs_ = new_coeffs # Notice the _

и ваш геттер

    @property
    def coeffs(self):
        return self.coeffs_
0 голосов
/ 05 июля 2019

Проблема решена! Я не знаю почему, но все, что я сделал, это изменил self.coeffs на self._coeffs в методе poly __init__().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...