1

I am from Java world and new to python and so to Flask. Here is my views.py

from app import app

class Employee:
    def __init__(id,name): self.id = id; self.name = name;

@app.route('/')
@app.route('/index')
def index():
    return Employee(12345,"MyName")

In the function index(), when i tried to return "Hello World" without class Employee in the file and run the server, Hello World string was written to the webpage.

I then thought of outputting a json,

{"id":"12345","name":"MyName"}

So I started to introduce a class Employee and created a constructor to pass id and name.

Unfortunately it started showing this error.

File "C:\python\microblog\app\views.py", line 9, in index return Employee(12345,"MyName")

By the way, here i assume that if I can get rid of the error, flask would be able to convert the object to json by taking it as default mimetype for objects.

I had look at these answers, but didn't help with my knowledge.

Community
  • 1
  • 1

2 Answers2

4

Python "methods" are really functions and no pointer to the current instance is magically inserted in the function's scope, so you have to declare your first argument as a reference to the current instance (by convention this argument is named self) - or as a reference to the current class if it's a classmethod (and then the first argument is - by convention - named cls).

When the function name is looked up on an instance, it's turned into a (callable) method object that keeps a reference to both the function and the current instance and inserts the instance as the first argument to the function call, as explained here : https://wiki.python.org/moin/FromFunctionToMethod - so you dont have (and must not) explicitely pass the current instance when calling the method.

NB : I understand this might seems weird (and worse) coming from the Java world, but there are actually quite a few good reasons for this peculiar design, as you'll probably find out by yourself when you'll start exploring the dynamic programming / metaprogramming part of Python.

bruno desthuilliers
  • 75,974
  • 6
  • 88
  • 118
3

In first argument on __init__ you must pass self:

class Employee:
    def __init__(self, id,name): 
       self.id = id; self.name = name;

Because self it's ref ob object Employee. Every Python object has two special method: __new__ and __init__. The first method for create object, it hasn't ref on object (self) and the second for initialise created object so it has ref named self.

oxana
  • 375
  • 1
  • 3
  • 10