python - flask中为何有这么多的直接返回‘一句话’调用的方法呢?
大家讲道理
大家讲道理 2017-04-18 10:22:26
0
2
608

标题可能说得不是很清楚,还是上代码:

Flask.wsgi_app(self, environ, start_response):
    ctx = self.request_context(environ)

然后可以看到,实际上会调用

def request_context(self, environ):
        return _RequestContext(self, environ)
        

之后再进入到class _RequestContext(object): 的__init__函数中,后面就不再写了。

我的疑惑是,在第一句生成ctx的时候,为何要弄出一个request_context 方法来呢?这个方法就只有简单的一个返回语句,那么我直接在开始的时候实例化不就好了:ctx = _RequestContext(self, environ)
而且像这样的使用方式在flask中其他地方也还有很多,那么这样使用有什么明显的好处吗? (或者说像我那样写的直接返回的句子有什么明显的坏处吗?)

大家讲道理
大家讲道理

光阴似箭催人老,日月如移越少年。

membalas semua(2)
大家讲道理

Ini soal reka bentuk dan citarasa, bukan isu teknikal.

Ambil contoh yang anda berikan Kami melihat bahawa terdapat lapisan enkapsulasi di sini, tetapi kerana kandungan yang dikapsulkan terlalu mudah, ia membuatkan anda tertanya-tanya sama ada ia perlu. Untuk menjawab soalan ini, kita perlu memikirkan mengapa terdapat enkapsulasi? Sama ada ia fungsi atau kelas, kami mungkin mentakrifkannya atas sebab berikut:

  • Mereka menyediakan fungsi logik yang lebih mudah untuk kita fahami

  • Logik ini akan dipanggil dengan kerap untuk mengelakkan pertindihan (prinsip KERING), kami mengabstrakkannya

Contoh ini konsisten dengan dua item di atas: kelalang memerlukan fungsi untuk mencipta konteks aplikasi dan ia digunakan di banyak tempat.

➜  flask grep "\.request_context" -rin .
./app.py:1918:            with app.request_context(environ):
./app.py:1925:            ctx = app.request_context(environ)
./app.py:1948:            return self.request_context(builder.get_environ())
./app.py:1977:        ctx = self.request_context(environ)

Faedah lain ialah RequestContext ialah kelas yang agak dalaman Dalam kebanyakan kes, pengguna tidak akan (dan tidak sepatutnya) menggunakannya secara langsung. Untuk membolehkan pengguna mencipta objek kelas ini, pengarang merangkumkan kaedah Flask.request_context(), yang dianggap sebagai prinsip antara muka minimum (cuba berikan antara muka terkecil kepada pengguna).

Satu lagi kelebihan enkapsulasi ialah selagi antara muka tetap, pelaksanaan dalaman boleh diubah sesuka hati. Dalam versi anda, permulaan ialah ctx = _RequestContext(self, environ) Dalam versi yang saya pasang (Flask==0.12), baris kod ini ialah ctx = RequestContext(self, environ). Walaupun ini hanyalah perubahan mudah dalam nama kelas, kami dapat memahami daripadanya bahawa jika pelaksanaan atau permulaan RequestContext kami berubah, semua pemanggil tidak perlu menukar jika tidak, semua pemanggil mesti mengikuti Semakan.

Sudah tentu, kandungan yang terkandung di sini hanya satu ayat Faedah-faedah ini tidak begitu jelas, malah ia kelihatan agak tidak masuk akal di pihak saya. Tetapi saya rasa ini adalah hasil pemikiran pengarang, kerana RequestContext ialah kelas yang agak penting dalam Flask, dan ia berkemungkinan besar akan diubah suai pada masa hadapan (menambah beberapa atribut, menukar parameter permulaan, dll.), dan merangkum ia lapisan untuk dengan mudah mengatasi kemungkinan perubahan masa depan. Lagipun, perkara penting dalam kejuruteraan perisian ialah bertindak balas terhadap perubahan .

大家讲道理

Ini ialah persoalan sama ada pembolehubah ahli berorientasikan objek kelihatan kepada dunia luar Apa yang dikendalikan di sini ialah pembolehubah ahli kelas, yang tidak sesuai untuk akses langsung.
Anda boleh merujuk kepada harta pada pendapat anda apa kelebihan harta?
Jelas sekali, apabila atribut yang anda perlukan tidak diperoleh secara langsung tetapi diperoleh melalui pengiraan, anda hanya perlu mengubah suai kaedah pemerolehan atribut.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan