Di django.utils.functional.py
:
for t in type(res).mro(): # <----- this
if t in self.__dispatch:
return self.__dispatch[t][funcname](res, *args, **kw)
Saya tidak mengerti mro()
. Apa fungsinya dan apa artinya "mro"?
python
method-resolution-order
zjm1126
sumber
sumber
Jawaban:
Ikuti...:
Selama kita memiliki satu warisan,
__mro__
hanyalah tuple dari: kelas, basisnya, basis basisnya, dan seterusnya hinggaobject
(hanya bekerja untuk kelas gaya baru tentu saja).Sekarang, dengan beberapa warisan ...:
... Anda juga mendapatkan jaminan bahwa, dalam
__mro__
, tidak ada kelas yang diduplikasi, dan tidak ada kelas setelah leluhurnya, kecuali bahwa kelas yang pertama kali masuk pada tingkat pewarisan berganda yang sama (seperti B dan C dalam contoh ini) ada di__mro__
kiri ke kanan.Setiap atribut yang Anda dapatkan pada instance kelas, bukan hanya metode, secara konseptual melihat ke atas
__mro__
, jadi, jika lebih dari satu kelas di antara leluhur menentukan nama itu, ini memberi tahu Anda di mana atribut akan ditemukan - di kelas pertama di yang__mro__
yang mendefinisikan nama itu.sumber
mro
dapat dikustomisasi oleh metaclass, dipanggil sekali pada inisialisasi kelas, dan hasilnya disimpan dalam__mro__
- lihat docs.python.org/library/… .mro()
singkatan dari Method Resolution Order. Ini mengembalikan daftar jenis kelas berasal, dalam urutan mereka mencari metode.mro () atau __mro__ hanya berfungsi pada kelas gaya baru. Di python 3, mereka bekerja tanpa masalah. Tetapi dalam python 2 kelas-kelas tersebut perlu diwarisi dari
object
.sumber
Ini mungkin akan menunjukkan urutan resolusi.
dan tanggapan akan
Aturannya adalah kedalaman-pertama, yang dalam hal ini berarti D, B, A, C.
Python biasanya menggunakan urutan kedalaman-pertama saat mencari kelas yang diwariskan, tetapi ketika dua kelas mewarisi dari kelas yang sama, Python menghapus penyebutan pertama dari kelas itu dari mro.
sumber
Urutan resolusi akan berbeda dalam warisan berlian.
sumber
class B3
tetapi dalam kasus kedua itu pergiclass A
setelahclass B1