RecursionError: максимальная глубина рекурсии, превышенная при выборе объекта - PullRequest
0 голосов
/ 27 апреля 2018

Я получаю RecusionError в программе ниже, я не могу понять, почему. Обратитесь за помощью к специалистам.

вызов метода foo Базового класса из производного класса приводит к RecusionError

BaseKill():
    def foo(self):
        print('what is wrong with jpython')
        return self.bar()
    def bar(self):
        print('just chill bar')
        return None

class Derived(BaseKill):
    def bar(self):
        print('I am bar')
        self.foo()
        self.hello()
    def hello(self):
        print('say Hi')


if __name__== '__main__':
    print('what')
    b=BaseKill()
    b.foo()
    c = Derived()
    c.bar()

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

Изученный опыт: при вызове метода того же класса, используйте его имя перед ними, например BaseKill.bar (self) , чтобы предотвратить ошибку из-за переопределения методов

BaseKill():
        def foo(self):
            print('what is wrong with jpython')
            #return self.bar() ----Error 'self' referred to Calling class
            return BaseKill.bar(self) #referred to same class method

        def bar(self):
            print('just chill bar')
            return None

    class Derived(BaseKill):
        def bar(self):
            print('I am bar')
            self.foo()
            self.hello()
        def hello(self):
            print('say Hi')


    if __name__== '__main__':
        print('what')
        b=BaseKill()
        b.foo()
        c = Derived()
        c.bar()
0 голосов
/ 27 апреля 2018

Когда вы делаете class Derived(BaseKill), class Derived() теперь "наследует" методы от class BaseKill.

Включая foo() и bar().

Однако у вас есть bar(), определенный в class Derived(), который имеет прецедент над "унаследованным bar()"

В основном это похоже на следующее

class Derived():
    def foo(self):
        print('what is wrong with jpython')
        return self.bar()    
    def bar(self):
        print('I am bar')
        self.foo()
        self.hello()
    def hello(self):
        print('say Hi')


if __name__== '__main__':
    print('what')
    c = Derived()
    c.bar()

Из этого кода вы можете ясно видеть, что bar() вызывает foo(), что, в свою очередь, вызывает bar() снова. Это бесконечность / рекурсия.

Ошибка, которую вы видите, верна.

В исходном коде вы можете включить несколько операторов print, чтобы получить имя класса, представленное self, например print(self.__class__.__name__). Это поможет вам лучше понять наследование классов.

Возможно, вы захотите посмотреть @staticmethod для BaseKill.bar(), однако это изменит функциональность, поэтому убедитесь, что вы тщательно протестировали это, чтобы убедиться, что это то, что вам нужно:

class BaseKill():
    def foo(self):
        print('what is wrong with jpython')
        return BaseKill.bar()
    @staticmethod
    def bar():
        print('just chill bar')
        return None

class Derived(BaseKill):
    def bar(self):
        print('I am bar')
        self.foo()
        self.hello()
    def hello(self):
        print('say Hi')


if __name__== '__main__':
    print('what')
    b=BaseKill()
    b.foo()
    c = Derived()
    c.bar()

Подробнее о @staticmethod здесь

В качестве альтернативы вы можете сделать следующее для foo() in BaseKill:

class BaseKill():
    def foo(self):
        print('what is wrong with jpython')
        return BaseKill.bar(self)
...