Saya telah belajar Python dengan mengikuti beberapa tutorial pygame .
Di sana saya menemukan banyak penggunaan kata kunci diri , dan terutama berasal dari latar belakang Jawa, saya menemukan bahwa saya terus lupa mengetik sendiri . Sebagai contoh, bukannya self.rect.centerx
saya akan mengetik rect.centerx
, karena, bagi saya, rect sudah menjadi variabel anggota kelas.
Paralel Java yang dapat saya pikirkan untuk situasi ini adalah harus mengawali semua referensi ke variabel anggota dengan ini .
Apakah saya terjebak dengan awalan semua variabel anggota dengan diri saya sendiri , atau adakah cara untuk mendeklarasikannya agar saya dapat menghindari keharusan melakukannya?
Bahkan jika apa yang saya sarankan bukanlah pythonic , saya masih ingin tahu apakah itu mungkin.
Saya telah melihat pada pertanyaan-pertanyaan SO terkait ini, tetapi mereka tidak cukup menjawab apa yang saya cari:
m_
awalan untuk semua nama anggota yang diamati oleh beberapa programmer C ++ / Java? Penggunaanself.
membantu keterbacaan dengan cara yang sama. Anda juga harus membaca dirtsimple.org/2004/12/python-is-not-java.html .m_
digunakan hanya untuk anggota data non-publik non-statis (setidaknya dalam C ++).mVariableName
, untuk variabel anggota, saat pengkodean di Jawa. Saya pikir komentar @ Anurag merangkumnya dengan cukup baik, untuk apa yang harus dilakukan oleh seorang pengembang java ketika belajar python.Jawaban:
Python membutuhkan menentukan sendiri. Hasilnya adalah tidak pernah ada kebingungan tentang apa yang anggota dan apa yang tidak, bahkan tanpa definisi kelas penuh yang terlihat. Ini mengarah ke properti yang berguna, seperti: Anda tidak dapat menambahkan anggota yang secara tidak sengaja membayangi bukan anggota dan karenanya memecahkan kode.
Salah satu contoh ekstrem: Anda dapat menulis kelas tanpa pengetahuan tentang kelas dasar apa yang mungkin dimilikinya, dan selalu tahu apakah Anda mengakses anggota atau tidak:
Itu kode lengkap ! (some_function mengembalikan tipe yang digunakan sebagai basis.)
Lain, di mana metode kelas secara dinamis disusun:
Ingat, kedua contoh ini ekstrem dan Anda tidak akan melihatnya setiap hari, saya juga tidak menyarankan Anda harus sering menulis kode seperti ini, tetapi mereka jelas menunjukkan aspek diri yang secara eksplisit diperlukan.
sumber
self
.__shadow__ myFieldName
. Itu akan mencegah bayangan yang tidak disengaja juga, bukan?Jawaban sebelumnya pada dasarnya adalah varian "Anda tidak bisa" atau "Anda tidak boleh". Sementara saya setuju dengan sentimen terakhir, pertanyaannya secara teknis masih belum terjawab.
Selain itu, ada alasan sah mengapa seseorang mungkin ingin melakukan sesuatu sesuai dengan pertanyaan yang diajukan. Satu hal yang sering saya temui adalah persamaan matematika yang panjang di mana menggunakan nama panjang membuat persamaan tidak dapat dikenali. Berikut adalah beberapa cara bagaimana Anda bisa melakukan ini dalam contoh kalengan:
Contoh ketiga - yaitu menggunakan
for k in self.__dict__ : exec(k+'= self.'+k)
pada dasarnya adalah pertanyaan yang sebenarnya ditanyakan, tetapi izinkan saya menjadi jelas bahwa menurut saya umumnya itu bukan ide yang baik.Untuk info lebih lanjut, dan cara untuk mengulangi melalui variabel kelas, atau bahkan fungsi, lihat jawaban dan diskusi untuk pertanyaan ini . Untuk diskusi tentang cara lain untuk memberi nama variabel secara dinamis, dan mengapa ini biasanya bukan ide yang baik, lihat posting blog ini .
UPDATE: Tampaknya tidak ada cara untuk secara dinamis memperbarui atau mengubah lokal dalam suatu fungsi di Python3, sehingga calc3 dan varian serupa tidak lagi mungkin. Satu-satunya solusi yang kompatibel dengan python3 yang dapat saya pikirkan sekarang adalah menggunakan
globals
:Yang, sekali lagi, akan menjadi praktik yang mengerikan pada umumnya.
sumber
locals
daripada menggunakanexec
?locals().update(self.__dict__)
dengan python 2 dan 3, tetapi tidak berhasil. Dalam python3 bahkan trik 'exec' bukan pilihan lagi. Di sisi lain,globals().update(self.__dict__)
memang berhasil, tetapi akan menjadi praktik yang mengerikan pada umumnya.Sebenarnya
self
bukan kata kunci, itu hanya nama yang secara konvensional diberikan kepada parameter pertama metode contoh dengan Python. Dan parameter pertama itu tidak bisa dilewati, karena itu satu-satunya mekanisme yang dimiliki metode untuk mengetahui instance kelas Anda yang dipanggil.sumber
Anda dapat menggunakan nama apa pun yang Anda inginkan, misalnya
atau bahkan
tetapi Anda tidak dapat menggunakan nama untuk ruang lingkup.
Saya tidak menyarankan Anda menggunakan sesuatu yang berbeda untuk diri sendiri kecuali Anda memiliki alasan yang meyakinkan, karena itu akan membuatnya asing untuk pythonista yang berpengalaman.
sumber
self
, dan Anda harus mengikuti konvensi itu. Ini akan membuat kode Anda lebih mudah dipahami oleh programmer Python berpengalaman yang melihatnya. (Ini termasuk Anda, enam bulan dari sekarang, mencoba mencari tahu apa program lama Anda!)def function(_, variable): _.variable = variable
def funcion(*args): args[0].variable = args[1]
ya, Anda harus selalu menentukan
self
, karena eksplisit lebih baik daripada implisit, menurut filosofi python.Anda juga akan menemukan bahwa cara Anda memprogram dalam python sangat berbeda dari cara Anda memprogram di java, maka penggunaan
self
cenderung menurun karena Anda tidak memproyeksikan segala sesuatu di dalam objek. Sebaliknya, Anda menggunakan fungsi tingkat modul yang lebih besar, yang dapat diuji lebih baik.ngomong-ngomong. Awalnya aku benci, sekarang aku benci yang sebaliknya. sama untuk kontrol aliran indent-driven.
sumber
self
dengan cara apa pun. Jadi apa gunanya memiliki mereka di kelas?"Diri" adalah placeholder konvensional dari instance objek saat ini dari kelas. Ini digunakan ketika Anda ingin merujuk ke properti objek atau bidang atau metode di dalam kelas seolah-olah Anda merujuk ke "sendiri". Tetapi untuk membuatnya lebih pendek seseorang di ranah pemrograman Python mulai menggunakan "diri", ranah lain menggunakan "ini" tetapi mereka menjadikannya sebagai kata kunci yang tidak dapat diganti. Saya lebih suka menggunakan "nya" untuk meningkatkan keterbacaan kode. Ini salah satu hal baik dalam Python - Anda memiliki kebebasan untuk memilih placeholder Anda sendiri untuk contoh objek selain "diri". Contoh untuk diri sendiri:
Sekarang kita ganti 'diri' dengan 'nya':
mana yang lebih mudah dibaca sekarang?
sumber
s
(atau satu huruf tunggal) alih-alihits
s
memiliki arti yang sama: alias ke instance kelas. saya harus mencari apaits
artinya dalam konteks yang samadiri adalah bagian dari sintaks python untuk mengakses anggota objek, jadi saya khawatir Anda terjebak dengannya
sumber
Sebenarnya Anda bisa menggunakan resep "Implisit diri" dari presentasi Armin Ronacher "5 tahun ide buruk" (google it).
Ini resep yang sangat pintar, karena hampir semuanya dari Armin Ronacher, tetapi saya tidak berpikir ide ini sangat menarik. Saya pikir saya lebih suka eksplisit ini di C # / Java.
Memperbarui. Tautan ke "resep ide buruk": https://speakerdeck.com/mitsuhiko/5-years-of-bad-ideas?slide=58
sumber
def method(
<del> self </del>)
, tetapiself.variable
masih diperlukan dengan peretas cerdas ini.Ya, diri itu membosankan. Tapi, apakah ini lebih baik?
sumber
_
memiliki arti khusus di shell Python, di mana ia memegang nilai yang dikembalikan terakhir. Aman untuk menggunakannya seperti ini, tetapi berpotensi membingungkan; Saya akan menghindarinya.s
ataum
(untuk meniru C ++)From: Self Hell - Lebih banyak fungsi stateful.
sumber
__str__
dan sejenisnya) karena ini dipanggil dengan cara yang berbeda dengan metode normal.Saya pikir akan lebih mudah dan lebih mudah dibaca jika ada pernyataan "anggota" sama seperti ada "global" sehingga Anda dapat memberi tahu penerjemah yang merupakan objek anggota kelas.
sumber