我故意删除app = Flask(名称)中的名称,我收到此错误:
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)
我的问题是:这个 init 方法在哪里至少需要2个参数?
答案 0 :(得分:10)
如果您理解类和对象的概念,那么__init__
是初始化类实例的构造函数。在这种情况下,该类是Flask,当您执行以下操作时,您正在初始化Flask对象的实例:
app = Flask(__name__)
现在你的问题是,“这个init方法在哪里至少需要2个参数?”
可以按照下面定义解释代码中的构造函数。
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):
如果您看到上述内容,则self
和import name
是必需参数,其余均为默认值或不需要。 Python需要self
,即使您可以将其命名为其他任何内容。阅读此博客由python本人的创建者为http://neopythonic.blogspot.com/2008/10/why-explicit-self-has-to-stay.html
答案 1 :(得分:7)
__init__
类似于python中的构造函数 - 它是在创建对象的新实例时调用的函数,在本例中是Flask
应用程序对象。
App对象需要import_name
,这是您传递给Flask
构造函数的第一个参数。您可以阅读有关here的更多信息(请参阅“关于第一个参数”)
答案 2 :(得分:2)
答案 3 :(得分:1)
您需要为Flask应用程序命名:
app = Flask(__name__)
__name__
将是当前模块的名称,但您原则上可以将其称为任何内容......
答案 4 :(得分:1)
要直接回答您的问题:调用__init__
会调用Flask()
。您的原始调用旨在启动类Flask
的实例,__init__
是执行设置的函数。
尽管如此解决您的问题:您只需要传递一个参数。错误消息具有误导性。
@codegeek的例子显示了&#34;第一个&#34;论证是。它是self
。但是,当class.__init__
被称为调用Flask()
的结果时,会从类内部传递出来。您没有看到self
被使用,除了隐含地 - 它是您的追溯中的(给定的)参数,当您想您正在传递零参数。
重要的是,这种情况并非独一无二 - 您可以在非常简单的示例中看到相同的内容,例如:
class Example:
def __init__(self, one):
self.one = one
ex = Example()
这将产生:
TypeError: __init__() takes exactly 2 arguments (1 given)
意思是Example()
来电__init__
,这需要“自我”和“自我”。并且“只有一个人”,而且只有“自我”。
(但问题是,我强烈建议您阅读类似http://pythoncentral.io/introduction-to-python-classes/的内容或python类的其他介绍。类是语言的基本元素,初始化它们是其功能的基本部分。)
答案 5 :(得分:0)
要简单回答您的问题, __ init __ 方法是此处Flask()类的默认构造函数。它只是驻留在您刚刚从语句
导入的Flask类中from flask import Flask
所以,你说的那一刻
app = Flask(__name__)
它所做的只是实例化这个Flask类的一个对象。由于您没有传递 __ name __ 参数,因此会抛出错误。
你可以找到 __ init __ 方法here