簡體   English   中英

Flask 實例化 app = Flask()

[英]Flask instanciation app = Flask()

我在app故意刪除名稱=瓶(名稱),我得到這個錯誤:

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方法在哪里?

如果您了解類和對象的概念,那么__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是必需的參數,rest 都是默認的或不需要的。 Python 需要self ,即使您可以將其命名為任何其他名稱。 閱讀 python 的創建者自己的博客,了解為什么http://neopythonic.blogspot.com/2008/10/why-explicit-self-has-to-stay.html

__init__類似於 python 中的構造函數——它是在創建對象的新實例時被調用的函數,在這種情況下是Flask應用程序對象。

App 對象需要一個import_name ,這是您傳遞給Flask構造函數的第一個參數。 您可以在此處閱讀更多相關信息(請參閱“關於第一個參數”)

我的問題是:這個至少需要 2 個參數的 init 方法在哪里?

就在這里:

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

您需要為 Flask 應用程序命名:

app = Flask(__name__)

__name__將是當前模塊的名稱,但原則上您可以隨意稱呼它...

直接回答您的問題: __init__是調用Flask() 您最初的調用旨在啟動Flask類的實例,而__init__是進行設置的函數。

不過,要解決您的直接問題:您只需要傳遞一個參數。 錯誤消息具有誤導性。

這不是錯誤的,但它談論的是一個不是你認為你調用的函數。 @codegeek 的示例向您展示了“第一個”參數是什么。 self 但是當class.__init__作為調用Flask()結果而被調用時,它是從 Class 內部傳遞的。 您沒有看到self被使用,除了隱式 - 當您認為傳遞參數時,它是回溯中的(給定的)參數。

重要的是,這並不是這種情況獨有的——您會在非常簡單的示例中看到同樣的事情,例如:

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 類介紹的內容。類是該語言的基本元素,初始化它們是其功能的基本部分。)

為了簡單回答您的問題, __init__方法是此處 Flask() 類的默認構造函數。 它只是駐留在您剛剛從語句中導入的 Flask 類中

from flask import Flask

所以,你說的那一刻

app = Flask(__name__)

它所做的只是實例化這個 Flask 類的一個對象。 而且由於您沒有傳遞__name__參數,因此它會引發錯誤。

你可以在這里找到__init__方法

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM