Python + Flask:__ init __()需要2个位置参数,但3个被赋予

时间:2015-04-22 11:05:06

标签: python flask

我来自Java世界,是python的新手,也是Flask的新手。这是我的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")

在函数index()中,当我试图在文件中没有类Employee的情况下返回“Hello World”并运行服务器时,Hello World字符串被写入网页。

然后我想到输出一个json,

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

所以我开始介绍一个类Employee,并创建了一个构造函数来传递id和name。

不幸的是,它开始显示此错误。

  

文件“C:\ python \ microblog \ app \ views.py”,第9行,索引返回   雇员(12345, “MYNAME”)

顺便说一句,在这里我假设如果我可以摆脱错误,那么烧瓶就可以将对象转换为json,将其作为对象的默认mimetype。

我看过这些answers,但对我的知识没有帮助。

2 个答案:

答案 0 :(得分:3)

Python"方法"实际上是函数,并且没有指向当前实例的指针神奇地插入到函数的作用域中,因此您必须将第一个参数声明为对当前实例的引用(按照惯例,此参数名为self) - 或者作为对当前类的引用,如果它是classmethod(然后第一个参数是 - 按惯例 - 命名为cls)。

当在实例上查找函数名时,它会变成一个(可调用的)method对象,该对象保持对函数和当前实例的引用,并将实例作为第一个实例插入函数调用的参数,如下所述:https://wiki.python.org/moin/FromFunctionToMethod - 所以你在调用方法时没有(也绝不能)明确地传递当前实例。

注意:我知道这可能看起来很奇怪(甚至更糟)来自Java世界,但实际上有很多很好的理由来设计这种奇特的设计,因为当你&#39时你可能会自己找到它们。 ; ll开始探索Python的动态编程/元编程部分。

答案 1 :(得分:2)

__init__的第一个论点中,你必须通过自我:

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

因为self它的参考对象是员工。 每个Python对象都有两种特殊方法:__new____init__。创建对象的第一种方法,它没有引用对象(self),第二种方法是初始化创建的对象,所以它的引用名为self。