Saya menemukan sesuatu seperti ini di proyek sumber terbuka. Metode yang mengubah atribut instance mengembalikan referensi ke instance. Apa tujuan konstruk ini?
class Foo(object):
def __init__(self):
self.myattr = 0
def bar(self):
self.myattr += 1
return self
python
method-chaining
nate c
sumber
sumber
Jawaban:
Ini untuk memungkinkan rantai.
Sebagai contoh:
Sekarang Anda bisa mengatakan:
sumber
Seperti yang disebutkan oleh @Lie Ryan dan @Frank Shearar, itu disebut "antarmuka yang lancar" tetapi pola itu sudah ada sejak lama.
Bagian yang kontroversial dari pola itu adalah bahwa dalam OO, Anda memiliki status yang bisa berubah, sehingga metode batal memiliki jenis nilai pengembalian tersirat
this
- yaitu, objek dengan status yang diperbarui adalah jenis nilai pengembalian.Jadi, dalam bahasa OO dengan status dapat berubah, keduanya lebih kurang sama:
...sebagai lawan
Jadi saya pernah mendengar orang di masa lalu menolak antarmuka yang lancar karena mereka menyukai bentuk pertama. Nama lain yang pernah saya dengar untuk "antarmuka yang lancar" adalah "train wreck";)
Saya mengatakan "kurang lebih setara", karena antarmuka yang lancar menambah kerutan. Mereka tidak harus "mengembalikan ini". Mereka dapat "mengembalikan yang baru". Itu cara untuk mencapai objek yang tidak dapat diubah di OO.
Jadi Anda bisa memiliki kelas A yang melakukan (pseudocode)
Sekarang, setiap metode mengembalikan objek baru, meninggalkan objek awal tidak berubah. Dan itu adalah cara masuk ke objek yang tidak dapat diubah tanpa benar-benar banyak berubah dalam kode Anda.
sumber
new(...)
, itu akan membocorkan memori.__init__
berulang kali juga memperkenalkan overhead.Sebagian besar bahasa menyadari idiom 'kembali sendiri', dan abaikan saja jika tidak digunakan dalam satu baris. Namun perlu dicatat bahwa dalam Python, fungsi kembali
None
secara default.Ketika saya di sekolah CS instruktur saya membuat besar kesepakatan tentang perbedaan antara fungsi, prosedur, rutinitas, dan metode; banyak pertanyaan esai kram tangan diselesaikan dengan pensil mekanik yang menjadi panas di tangan saya tentang semua itu.
Cukuplah untuk mengatakan, kembali diri adalah cara OO definitif untuk membuat metode kelas, tetapi Python memungkinkan untuk beberapa nilai kembali, tupel, daftar, objek, primitif, atau Tidak ada.
Chaining, seperti yang mereka katakan, hanyalah menempatkan jawaban untuk operasi terakhir ke yang berikutnya, dan runtime dari Python dapat mengoptimalkan hal semacam itu. Pemahaman daftar adalah bentuk bawaan dari hal ini. (Sangat kuat!)
Jadi dalam Python tidak begitu penting bahwa setiap metode atau fungsi mengembalikan sesuatu, itulah sebabnya defaultnya adalah None.
Ada aliran pemikiran bahwa setiap tindakan dalam suatu program harus melaporkan keberhasilan, kegagalan, atau hasilnya kembali ke konteks atau objek yang memohon, tetapi kemudian tidak berbicara Persyaratan DOD ADA di sini. Jika Anda perlu mendapatkan umpan balik dari suatu metode, silakan, atau tidak, tetapi cobalah untuk konsisten tentang hal itu.
Jika suatu metode dapat gagal, itu harus mengembalikan keberhasilan atau kegagalan atau menimbulkan pengecualian untuk ditangani.
Satu peringatan adalah bahwa jika Anda menggunakan idiom self return, Python akan memungkinkan Anda untuk menetapkan semua metode Anda ke variabel dan Anda mungkin berpikir Anda mendapatkan hasil data atau daftar ketika Anda benar-benar mendapatkan objek.
Jenis-bahasa yang membatasi berteriak dan berteriak ketika Anda mencoba melakukan ini, tetapi yang ditafsirkan (Python, Lua, Lisp) jauh lebih dinamis.
sumber
Dalam Smalltalk, setiap metode yang tidak secara eksplisit mengembalikan sesuatu, memiliki "return self" yang tersirat.
Itu karena (a) setiap metode mengembalikan sesuatu membuat model komputasi lebih seragam dan (b) sangat berguna memiliki metode mengembalikan sendiri. Josh K memberikan contoh yang bagus.
sumber
Python
, setiap metode yang tidak secara eksplisit mengembalikan sesuatu, memiliki "return None" yang tersirat.Kelebihan mengembalikan objek (
return self
)Contoh:
Gaya yang lebih populer di komunitas pemrograman (saya pikir).
Kelebihan bermutasi objek (tidak ada
return self
)return
untuk tujuan lain.sumber