【问题标题】:Python+Flask: __init__() takes 2 positional arguments but 3 were givenPython+Flask:__init__() 接受 2 个位置参数,但给出了 3 个
【发布时间】:2015-04-22 11:05:06
【问题描述】:

我来自 Java 世界,是 python 的新手,也是 Flask 的新手。这是我的意见。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,“我的名字”)

顺便说一句,这里我假设如果我可以摆脱错误,flask 将能够通过将对象作为对象的默认 mimetype 将对象转换为 json。

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

【问题讨论】:

  • __init__ 应该有 self 作为它的第一个参数。

标签: python flask


【解决方案1】:

Python“方法”是真正的函数,没有指向当前实例的指针被神奇地插入到函数的作用域中,所以你必须将你的第一个参数声明为对当前实例的引用(按照惯例,这个参数被命名为self ) - 如果它是 classmethod,则作为对当前类的引用(然后第一个参数 - 按照约定 - 命名为 cls)。

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

注意:我知道这来自 Java 世界可能看起来很奇怪(而且更糟),但实际上这种奇特的设计有很多很好的理由,当你开始探索时你可能会自己发现Python 的动态编程/元编程部分。

【讨论】:

    【解决方案2】:

    __init__ 的第一个参数中,您必须传递 self:

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

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

    【讨论】:

      猜你喜欢
      • 2014-05-01
      • 1970-01-01
      • 2017-02-18
      • 2017-10-09
      • 1970-01-01
      • 2022-01-04
      • 1970-01-01
      • 2023-03-03
      • 1970-01-01
      相关资源
      最近更新 更多