【问题标题】:Flask instanciation app = Flask()Flask 实例化 app = Flask()
【发布时间】:2013-07-16 14:10:01
【问题描述】:

我故意删除了 app = Flask(name) 中的 name 并收到此错误:

Traceback (most recent call last):
    File "routes.py", line 4, in <module>
        app = Flask() 
TypeError: __init__() takes at least 2 arguments (1 given)

这是我来自 nettuts 的代码,这是我的代码:

from flask import Flask, render_template

app = Flask() 

@app.route('/')
def home():
    return render_template('home.html')

@app.route('/about')
def about():
    return render_template('about.html')


if __name__ == '__main__':
    app.run(debug=True)

我的问题是:这个至少需要 2 个参数的 init 方法在哪里?

【问题讨论】:

  • 如果你想看 Flask 的实际代码你可以去 /venv/lib/python.27/site-packages/flask 所有你用 pip 安装的东西都在这里,如果你使用了 virtualenv,你应该做什么;)

标签: python flask init


【解决方案1】:

如果你了解类和对象的概念,那么__init__ 就是初始化类实例的构造函数。在这种情况下,类是 Flask,当您执行以下操作时,您正在初始化 Flask 对象的实例:

app = Flask(__name__) 

现在你的问题是,“这个至少需要 2 个参数的 init 方法在哪里?”

这可以按照下面定义代码中的构造函数的定义来解释。

def __init__(self, import_name, static_path=None, static_url_path=None,
                 static_folder='static', template_folder='templates',
                 instance_path=None, instance_relative_config=False):

如上所示,selfimport name 是必填参数,其余均为默认或不需要。 Python 需要self,即使您可以将其命名为其他任何名称。阅读 python 的创建者本人的这篇博客,了解为什么http://neopythonic.blogspot.com/2008/10/why-explicit-self-has-to-stay.html

【讨论】:

    【解决方案2】:

    __init__ 类似于 python 中的构造函数 - 当您创建对象的新实例时调用它的函数,在本例中为 Flask 应用程序对象。

    App 对象需要一个import_name,这是您传递给Flask 构造函数的第一个参数。您可以阅读更多关于 here 的信息(参见“关于第一个参数”)

    【讨论】:

      【解决方案3】:

      我的问题是:这个至少需要 2 次的 init 方法在哪里? 论据?

      就在这里:

      https://github.com/pallets/flask/blob/master/src/flask/app.py#L401

      【讨论】:

        【解决方案4】:

        您需要为 Flask 应用程序命名:

        app = Flask(__name__)
        

        __name__ 将是当前模块的名称,但原则上你可以随意命名...

        【讨论】:

          【解决方案5】:

          直接回答您的问题:调用__init__ 是调用Flask() 的结果。您最初的调用是为了启动Flask 的一个实例,而__init__ 是执行设置的函数。

          但要解决您眼前的问题:您只需要传递一个参数。错误消息具有误导性。

          这不是不正确,而是在谈论一个不是你认为你调用的函数。 @codegeek 的示例向您展示了“第一个”参数是什么。这是self。但是,当class.__init__ 被称为调用Flask()结果 时,这是从类内部传递的。你看不到self 被使用,除了隐含的——它是你的回溯中的(1个给定的)参数,当你认为你传递了个参数。

          重要的是,这并不是本案例所独有的——您会在非常简单的示例中看到相同的情况,例如:

          class Example:
              def __init__(self, one):
                  self.one = one
          ex = Example()
          

          这将产生:

          TypeError: __init__() takes exactly 2 arguments (1 given)
          

          意思是,Example() 调用 __init__,它想要 'self' 和 'one',它只有 'self'。

          (不过,从这个问题来看,我强烈建议您阅读类似 http://pythoncentral.io/introduction-to-python-classes/ 或其他 Python 类介绍的内容。类是该语言的基本元素,初始化它们是其功能的基本部分。)

          【讨论】:

            【解决方案6】:

            为了简单地回答您的问题,__init__ 方法是此处 Flask() 类的默认构造函数。它只是驻留在您刚刚从语句中导入的 Flask 类中

            from flask import Flask
            

            所以,你说的那一刻

            app = Flask(__name__)
            

            它所做的只是实例化这个 Flask 类的一个对象。而且由于您没有传递 __name__ 参数,因此它会引发错误。

            你可以找到__init__方法here

            【讨论】:

              猜你喜欢
              • 2016-10-25
              • 2017-04-11
              • 1970-01-01
              • 2014-02-18
              • 1970-01-01
              • 1970-01-01
              • 2020-04-02
              • 1970-01-01
              • 2015-05-27
              相关资源
              最近更新 更多