标题可能说得不是很清楚,还是上代码:
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中其他地方也还有很多,那么这样使用有什么明显的好处吗? (或者说像我那样写的直接返回的句子有什么明显的坏处吗?)
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.
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 kaedahFlask.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 ialahctx = RequestContext(self, environ)
. Walaupun ini hanyalah perubahan mudah dalam nama kelas, kami dapat memahami daripadanya bahawa jika pelaksanaan atau permulaanRequestContext
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.