I am trying to write a simple recursive function in python3. As I am learning OO Java, I also want to write Python code involving objects. Here's my code below. I prompt the user to enter a number and the screen should display every integer smaller until 5.
class Recursion:
@staticmethod
def recursive(x):
if (x>5):
print (x)
recursive(x - 1)
def main(self):
x = int(input('Enter a number for recursive addition: '))
recursive(x)
However, when I run it on a terminal, it says: "NameError: name 'recursive' is not defined". Here's what the error looks like:
Python 3.5.1 (v3.5.1:37a07cee5969, Dec 5 2015, 21:12:44)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from Recursion import *
>>> a = Recursion()
>>> a.main()
Enter a number for recursive addition: 10
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/ZycinG/Desktop/Python Practice/Recursion.py", line 9, in main
recursive(x)
NameError: name 'recursive' is not defined
What causes the problem here? I know how to just write the recursive function, give it an argument, and let it run on the terminal. But I want to practice OOP.
consider you have the function defined in the global scope:
you would simply call this with
recusive(10)
from elsewhere in the program and similarly from within the function, if you make it astaticmethod
within a class:now it is stored in the global scope as
Recursion.recursive
so that is also how you would have to refer to it within the function:However if you want a method to have access to the class scope directly (locally to the function) you can label it a
classmethod
:this has several benefits, first that it can be called as
Recursion.recursive(10)
orx = Recursion() ; x.recursive()
but also that it will use a subclass if appropriate instead of always usingRecursion
:although even if you do not use
staticmethod
orclassmethod
you still need to refer to the method, as a method: (in java you can use the methods just by name but python basically forces you to use methods asself.METHOD
similarly to java'sthis.METHOD
)Hope this clears things up about how methods work in python!