it-swarm-id.com

Tujuan `kembali sendiri` dari metode kelas?

Saya menemukan sesuatu seperti ini di proyek open-source. Metode yang memodifikasi 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
46
nate c

Ini untuk memungkinkan rantai.

Sebagai contoh:

var Car = function () {
    return {
        gas : 0,
        miles : 0,
        drive : function (d) {
            this.miles += d;
            this.gas -= d;
            return this;
        },
        fill : function (g) {
            this.gas += g;
            return this;
        },
    };
}

Sekarang Anda bisa mengatakan:

var c = Car();
c.fill(100).drive(50);
c.miles => 50;
c.gas => 50;
66
Josh K

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 void memiliki semacam nilai pengembalian tersirat dari this - yaitu, objek dengan status yang diperbarui adalah jenis nilai pengembalian .

Jadi dalam bahasa OO dengan status yang bisa berubah, keduanya kurang lebih sama:

a.doA()
a.doB()
a.doC()

...sebagai lawan

a.doA().doB().doC()

Jadi saya pernah mendengar orang di masa lalu menolak antarmuka yang lancar karena mereka menyukai bentuk pertama. Nama lain yang 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)

function doA():
    return new A(value + 1)

function doB():
    return new A(value * 2)

function doC():
    return new A(sqrt(value))

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.

10
Rob

Sebagian besar bahasa menyadari idiom 'kembali sendiri', dan abaikan saja jika tidak digunakan dalam satu baris. Namun perlu dicatat bahwa dalam Python, fungsi mengembalikan None secara default.

Ketika saya berada di sekolah CS, instruktur saya membuat kesepakatan besar 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, mengembalikan diri adalah cara definitif OO untuk membuat metode kelas, tetapi Python memungkinkan untuk beberapa nilai pengembalian, tupel, daftar, objek, primitif) , atau Tidak ada.

Chaining, sebagaimana mereka katakan, hanyalah menempatkan jawaban untuk operasi terakhir ke operasi berikutnya, dan runtime dari Python dapat mengoptimalkan hal semacam itu. Pemahaman daftar adalah bentuk bawaan dari ini. (Sangat kuat!)

Jadi dalam Python tidak begitu penting bahwa setiap metode atau fungsi mengembalikan sesuatu, itulah sebabnya defaultnya adalah Tidak Ada.

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, teruskan, 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.

Bahasa yang membatasi jenis menjerit dan berteriak dan menghancurkan ketika Anda mencoba melakukan ini, tetapi yang ditafsirkan (Python, Lua, LISP) jauh lebih dinamis.

8
Chris Reid

Dalam Smalltalk, setiap metode yang tidak secara eksplisit mengembalikan sesuatu, memiliki "return self" yang tersirat.

Itu karena (a) memiliki setiap metode mengembalikan sesuatu membuat model komputasi lebih seragam dan (b) sangat berguna memiliki metode mengembalikan sendiri. Josh K memberikan contoh yang bagus.

4
Frank Shearar

Kelebihan mengembalikan objek (return self)

  • Contoh:

    print(foo.modify1().modify2())
    
    # instaed of
    foo.modify1()
    foo.modify2()
    print(foo)
    
  • Gaya yang lebih populer di komunitas pemrograman (saya pikir).

Kelebihan bermutasi objek (tidak ada return self)

  • Kemampuan untuk menggunakan return untuk tujuan lain.
  • Guido van Rossum menyetujui gaya ini (Saya tidak setuju dengan argumennya).
  • Gaya yang lebih populer di Python (saya pikir).
  • Default (kurangi kode sumber).
2
xged