1) Mengapa self
diperlukan sebagai parameter eksplisit dalam tanda tangan metode?
Karena metode adalah fungsi dan foo.bar(baz)
hanya gula sintaksis bar(foo, baz)
. Kelas hanyalah kamus di mana beberapa nilai adalah fungsi. (Konstruktor juga hanya fungsi, itulah sebabnya Python tidak perlu new
) Anda dapat mengatakan bahwa Python membuatnya eksplisit bahwa objek dibangun dari komponen yang lebih sederhana. Ini sesuai dengan filosofi "eksplisit lebih baik daripada implisit".
Sebaliknya, dalam Java objek benar-benar ajaib dan tidak dapat direduksi menjadi komponen yang lebih sederhana dalam bahasa. Di Jawa (setidaknya sampai Java 8) fungsi selalu merupakan metode yang dimiliki oleh objek, dan kepemilikan ini tidak dapat diubah karena sifat statis bahasa. Oleh karena itu tidak ada ambiguitas tentang apa yang this
dirujuk, jadi masuk akal untuk mendefinisikannya secara implisit.
JavaScript adalah contoh bahasa yang memiliki implisit this
seperti Java, tetapi di mana fungsi dapat ada secara terpisah dari objek seperti di Python. Hal ini menyebabkan banyak kebingungan tentang apa yang this
merujuk ketika fungsi-fungsi dilewatkan dan dipanggil dalam konteks yang berbeda. Banyak yang secara naluriah berpikir this
harus mengacu pada beberapa sifat intrinsik dari fungsi tersebut, sementara itu sebenarnya murni ditentukan oleh cara fungsi itu disebut. Saya percaya memiliki this
sebagai parameter eksplisit seperti di Python akan membuat ini jauh lebih membingungkan.
Beberapa manfaat lain dari self
parameter- eksplisit :
Dekorator hanyalah fungsi yang membungkus fungsi lainnya. Karena metode hanyalah fungsi, dekorator berfungsi dengan baik pada metode. Jika ada semacam diri tersirat, dekorator tidak akan bekerja secara transparan pada metode.
Metode metode dan statis tidak mengambil parameter instance. Metode kelas mengambil kelas sebagai argumen pertama (biasanya disebut cls
). Parameter self
atau eksplisit cls
membuatnya lebih jelas apa yang sedang terjadi, dan apa yang Anda memiliki akses ke dalam metode.
2) Mengapa instance instance harus memenuhi syarat dengan " self.
?
Di Jawa, Anda tidak perlu membuat awalan variabel anggota dengan " this.
", tetapi dengan Python " self.
" selalu diperlukan. Alasannya adalah bahwa Python tidak memiliki sintaksis eksplisit untuk mendeklarasikan variabel, sehingga tidak akan ada cara untuk mengetahui apakah x = 7
seharusnya mendeklarasikan variabel lokal baru atau menetapkan ke variabel anggota. Menentukan self.
memecahkan ambiguitas ini.