Saya telah memprogram ke sejumlah bahasa seperti Java, Ruby, Haskell dan Python. Saya harus beralih di antara banyak bahasa per hari karena berbagai proyek yang saya kerjakan. Sekarang, masalahnya adalah saya sering lupa untuk menulis self
sebagai parameter pertama dalam definisi fungsi dalam Python yang sama adalah dengan memanggil metode pada objek yang sama.
Yang mengatakan, saya cukup kagum dengan pendekatan Python ini. Pada dasarnya kita harus mengetik lebih banyak untuk menyelesaikan sesuatu, dalam bahasa seperti Java dan Ruby hal-hal yang disederhanakan dengan secara otomatis merujuk variabel-variabel dalam objek saat ini.
Pertanyaan saya adalah mengapa ini self
perlu? Apakah ini murni pilihan gaya, atau adakah alasan mengapa Python tidak bisa membiarkan Anda menghilangkan self
cara Java dan C ++ membiarkan Anda menghilangkan this
?
@staticmethod
sebelum deklarasi metode, menekan kesalahan (hanya untuk info dan juga tidak disarankan)Jawaban:
1) Mengapa
self
diperlukan sebagai parameter eksplisit dalam tanda tangan metode?Karena metode adalah fungsi dan
foo.bar(baz)
hanya gula sintaksisbar(foo, baz)
. Kelas hanyalah kamus di mana beberapa nilai adalah fungsi. (Konstruktor juga hanya fungsi, itulah sebabnya Python tidak perlunew
) 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 yangthis
merujuk ketika fungsi-fungsi dilewatkan dan dipanggil dalam konteks yang berbeda. Banyak yang secara naluriah berpikirthis
harus mengacu pada beberapa sifat intrinsik dari fungsi tersebut, sementara itu sebenarnya murni ditentukan oleh cara fungsi itu disebut. Saya percaya memilikithis
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
). Parameterself
atau eksplisitcls
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 apakahx = 7
seharusnya mendeklarasikan variabel lokal baru atau menetapkan ke variabel anggota. Menentukanself.
memecahkan ambiguitas ini.sumber
self.
, seperti Java) pada dasarnya tidak kompatibel dengan aturan pelingkupan dan ketika Anda perlu secara eksplisit di sana, menjadi tersirat tentang parameter tidak masuk akal lagi.Ada alasan yang agak sederhana bahwa AFAIK belum benar-benar disentuh dalam duplikat lintas-situs, atau di sini: Python dimulai sebagai bahasa prosedural. Itu didasarkan pada ABC, juga bahasa prosedural.
Object-Orientation ditambahkan kemudian, dan ketika ditambahkan, Guido van Rossum ingin menambahkan jumlah fitur minimal yang mungkin, agar desain Python tetap sederhana. Python sudah memiliki
dict
fungsi dan s, jadi mengapa menambahkan sesuatu yang sama sekali baru ke bahasa, ketika sebuah objek hanya bisa menjadidict
slot dan kelas hanya bisa menjadidict
fungsi? Metode dapat diartikan sebagai fungsi yang diterapkan sebagian yang menutup satu argumen tunggal. Dan itulah tepatnya metode diimplementasikan dalam Python: tidak. Mereka hanya fungsi yang menerima argumen istimewa.sumber
Berikut adalah kesimpulan saya berdasarkan atas jawaban dan membaca Guido sendiri bertele-tele tentang topik ini:
Ide besar
Fungsi adalah blok bangunan penting dalam Python (atau kita harus mengatakan satu-satunya), pada kenyataannya kita adalah jenis meniru OOP dengan menggunakan fungsi.
Mengingat bahwa suatu kelas tidak lain hanyalah kamus fungsi, maka kita dapat melampirkan fungsi apa pun ke kelas mana pun pada saat run time. Pada dasarnya itu adalah karena kebutuhan ini untuk melemparkan fungsi-fungsi sekitar pada saat run time kita dapat melakukan hal-hal seperti Monkey Patching . Di sini
self
parameter yang mendukung polimorfisme parametrik.sumber