Apa tujuan dari self
kata dalam Python? Saya mengerti itu merujuk ke objek spesifik yang dibuat dari kelas itu, tapi saya tidak bisa melihat mengapa itu secara eksplisit perlu ditambahkan ke setiap fungsi sebagai parameter. Sebagai ilustrasi, di Ruby saya bisa melakukan ini:
class myClass
def myFunc(name)
@name = name
end
end
Yang saya mengerti, cukup mudah. Namun dalam Python saya harus memasukkan self
:
class myClass:
def myFunc(self, name):
self.name = name
Adakah yang bisa membicarakan ini dengan saya? Itu bukan sesuatu yang saya temui dalam pengalaman saya (memang terbatas).
@name
lebih intuitif daripadaself.name
? Yang terakhir, IMO, lebih intuitif.@foo
danself.foo
sama-sama eksplisit karena tidak ada resolusi implisit yang perlu terjadi (misalnya dalam C ++, anggota instance dapat "secara implisit" diakses tanpa "secara eksplisit" menggunakan ruang nama). Satu-satunya perbedaan adalah bahwa Ruby memperkenalkan semantik baru (@), sedangkan Python tidak. Apakah atau tidak semantik baru itu sepadan dengan jumlah kata yang dihindari adalah murni subjektif. Meskipun demikian, perlu dicatat bahwa sebagian besar bahasa modern memilih untuk memperkenalkan konsep di sini (misalnya, php's $ this, JS's this).Jawaban:
Alasan yang perlu Anda gunakan
self.
adalah karena Python tidak menggunakan@
sintaks untuk merujuk ke atribut instance. Python memutuskan untuk melakukan metode dengan cara yang membuat instance yang dimiliki metode dilewatkan secara otomatis, tetapi tidak diterima secara otomatis: parameter pertama metode adalah instance metode dipanggil. Itu membuat metode sepenuhnya sama dengan fungsi, dan meninggalkan nama sebenarnya untuk digunakan terserah Anda (meskipunself
konvensi, dan orang-orang umumnya akan cemberut pada Anda ketika Anda menggunakan sesuatu yang lain.)self
Tidak khusus untuk kode, itu hanya objek lain .Python dapat melakukan sesuatu yang lain untuk membedakan nama normal dari atribut - sintaks khusus seperti yang dimiliki Ruby, atau membutuhkan deklarasi seperti C ++ dan Java, atau mungkin sesuatu yang lebih berbeda - tetapi ternyata tidak. Semua Python untuk membuat segala sesuatu menjadi eksplisit, membuatnya menjadi jelas apa itu, dan meskipun ia tidak melakukannya sepenuhnya di mana-mana, ia melakukannya sebagai atribut. Itu sebabnya menugaskan ke atribut instance perlu tahu instance apa yang akan ditugaskan, dan itulah mengapa itu perlu
self.
.sumber
cls
mengacu pada objek kelas, bukan objek instancecls
danself
digunakan secara konvensional untuk metode contoh. Jika saya mau, saya bisa menggunakan metodeself
dancls
metode misalnya. Saya juga bisa menggunakanbob
danfnord
jika saya suka.this
bukanself
. Apakahself
ada riwayat yang tidak saya sadari dalam bahasa pemrograman yang lebih lama?self
datang dari konvensi Modula-3, lihat jawaban ini untuk perincian lebih lanjut tentang pilihan ini. (Penafian: miliknya).self
kunci (Smalltalk, 1980) mendahuluithis
kata kunci (dari C ++). Lihat: stackoverflow.com/questions/1079983/...Mari kita ambil kelas vektor sederhana:
Kami ingin memiliki metode yang menghitung panjangnya. Seperti apa jadinya jika kita ingin mendefinisikannya di dalam kelas?
Seperti apa seharusnya ketika kita mendefinisikannya sebagai metode / fungsi global?
Jadi seluruh struktur tetap sama. Bagaimana saya bisa memanfaatkan ini? Jika kita berasumsi bahwa kita belum menulis
length
metode untukVector
kelas kita, kita dapat melakukan ini:Ini berfungsi karena parameter pertama
length_global
, dapat digunakan kembali sebagaiself
parameter dalamlength_new
. Ini tidak akan mungkin terjadi tanpa eksplisitself
.Cara lain untuk memahami perlunya eksplisit
self
adalah untuk melihat di mana Python menambahkan beberapa gula sintaksis. Ketika Anda ingat, itu pada dasarnya, panggilan sepertidiubah secara internal menjadi
mudah untuk melihat di mana
self
cocok. Anda tidak benar-benar menulis contoh metode dengan Python; apa yang Anda tulis adalah metode kelas yang harus mengambil contoh sebagai parameter pertama. Dan karena itu, Anda harus menempatkan parameter instance di suatu tempat secara eksplisit.sumber
Vector.length_new = length_global
ditunjukkan.Katakanlah Anda memiliki kelas
ClassA
yang berisi metode yangmethodA
didefinisikan sebagai:dan
ObjectA
merupakan turunan dari kelas ini.Sekarang ketika
ObjectA.methodA(arg1, arg2)
dipanggil, python secara internal mengubahnya untuk Anda sebagai:The
self
variabel mengacu pada objek itu sendiri.sumber
Ketika objek dipakai, objek itu sendiri dilewatkan ke dalam parameter diri.
Karena itu, data objek terikat ke objek. Di bawah ini adalah contoh bagaimana Anda ingin memvisualisasikan apa yang terlihat dari data setiap objek. Perhatikan bagaimana 'diri' diganti dengan nama objek. Saya tidak mengatakan contoh diagram di bawah ini sepenuhnya akurat tetapi mudah-mudahan dengan tujuan untuk memvisualisasikan penggunaan diri.
Objek diteruskan ke parameter diri sehingga objek dapat menyimpan datanya sendiri.
Meskipun ini mungkin tidak sepenuhnya akurat, pikirkan proses instantiasi objek seperti ini: Ketika sebuah objek dibuat, ia menggunakan kelas sebagai templat untuk data dan metode sendiri. Tanpa meneruskan namanya sendiri ke parameter diri, atribut dan metode di kelas akan tetap sebagai templat umum dan tidak akan dirujuk ke (milik) objek. Jadi dengan memasukkan nama objek ke dalam parameter diri itu berarti bahwa jika 100 objek dibuat dari satu kelas, mereka semua dapat melacak data dan metode mereka sendiri.
Lihat ilustrasi di bawah ini:
sumber
Saya suka contoh ini:
sumber
self
tetapi juga pada tipe variabel. Coba lakukan contoh pertama dengan integer sederhana, bukan daftar. Hasilnya akan sangat berbeda.a.foo
dalam contoh pertama, bukanA.foo
? Jelasfoo
milik kelas ...a
danb
keduanya label (atau pointer) untukA()
(kelas).a.foo
referensiA().foo
metode kelas. Dalam contoh kedua, meskipun,a
menjadi referensi ke sebuah instance dariA()
, seperti halnyab
. Sekarang mereka adalah instance daripada objek kelas itu sendiri, self memungkinkanfoo
metode untuk beroperasi pada instance.Saya akan menunjukkan dengan kode yang tidak menggunakan kelas :
Kelas hanyalah cara untuk menghindari lulus dalam "keadaan" hal ini sepanjang waktu (dan hal-hal baik lainnya seperti inisialisasi, komposisi kelas, metaclasses yang jarang dibutuhkan, dan mendukung metode kustom untuk menimpa operator).
Sekarang mari kita tunjukkan kode di atas menggunakan mesin kelas python bawaan, untuk menunjukkan bagaimana pada dasarnya hal yang sama.
[memigrasikan jawaban saya dari pertanyaan tertutup rangkap]
sumber
Kutipan berikut berasal dari dokumentasi Python tentang diri :
Untuk informasi lebih lanjut, lihat tutorial dokumentasi Python di kelas .
sumber
Seperti halnya semua alasan lain yang telah dinyatakan, ini memungkinkan akses yang lebih mudah ke metode yang diganti; kamu bisa menelepon
Class.some_method(inst)
.Contoh di mana itu berguna:
sumber
Penggunaannya mirip dengan penggunaan
this
kata kunci di Jawa, yaitu untuk memberikan referensi ke objek saat ini.sumber
Python bukan bahasa yang dibangun untuk Pemrograman Berorientasi Objek tidak seperti Java atau C ++.
Saat memanggil metode statis dengan Python, seseorang cukup menulis metode dengan argumen reguler di dalamnya.
Namun, metode objek, yang mengharuskan Anda membuat variabel, yang merupakan Hewan, dalam hal ini, membutuhkan argumen sendiri
Metode mandiri juga digunakan untuk merujuk ke bidang variabel dalam kelas.
Dalam hal ini, self merujuk ke variabel animalName dari seluruh kelas. INGAT: Jika Anda memiliki variabel dalam suatu metode, self tidak akan berfungsi. Variabel itu hanya ada hanya saat metode itu berjalan. Untuk mendefinisikan bidang (variabel dari seluruh kelas), Anda harus mendefinisikannya di luar metode kelas.
Jika Anda tidak mengerti satu kata pun dari apa yang saya katakan, maka Google "Pemrograman Berorientasi Objek." Setelah Anda memahami ini, Anda bahkan tidak perlu mengajukan pertanyaan itu :).
sumber
staticMethod()
danobjectMethod(self)
. Saya ingin menambahkan bahwa untuk memohon yang pertama, Anda akan mengatakanAnimal.staticMethod()
, sementaraobjectMethod()
membutuhkan sebuah contoh:a = Animal(); a.objectMethod()
def getAnimalName
untuk tidak memecahkan string yang ingin Anda kembalikan, danself
merujuk ke instance kelas, bukan bidang apa pun di dalamnya.Itu ada di sana untuk mengikuti Python zen "eksplisit lebih baik daripada implisit". Itu memang referensi ke objek kelas Anda. Dalam Java dan PHP, misalnya, ini disebut
this
.Jika
user_type_name
adalah bidang pada model Anda, Anda mengaksesnyaself.user_type_name
.sumber
Pertama-tama, diri adalah nama konvensional, Anda dapat menempatkan hal lain (koheren) sebagai gantinya.
Itu merujuk ke objek itu sendiri, jadi ketika Anda menggunakannya, Anda menyatakan bahwa .name dan .age adalah properti dari objek Student (catatan, bukan dari kelas Student) yang akan Anda buat.
Kode ada di sini
sumber
self
adalah referensi objek ke objek itu sendiri, oleh karena itu, mereka sama. Metode python tidak dipanggil dalam konteks objek itu sendiri.self
di Python dapat digunakan untuk menangani model objek kustom atau sesuatu.sumber
Penggunaan argumen, yang biasa disebut
self
tidak sulit untuk dipahami, seperti mengapa perlu? Atau mengapa menyebutkannya secara eksplisit? Itu, saya kira, adalah pertanyaan yang lebih besar bagi sebagian besar pengguna yang mencari pertanyaan ini, atau jika tidak, mereka pasti akan memiliki pertanyaan yang sama ketika mereka terus belajar python. Saya merekomendasikan mereka untuk membaca beberapa blog ini:1: Penggunaan diri dijelaskan
Perhatikan bahwa ini bukan kata kunci.
2: Mengapa kita melakukannya dengan cara ini dan mengapa kita tidak bisa menghilangkannya sebagai argumen, seperti Java, dan memiliki kata kunci sebagai gantinya
Hal lain yang ingin saya tambahkan adalah,
self
argumen opsional memungkinkan saya untuk mendeklarasikan metode statis di dalam kelas, dengan tidak menulisself
.Contoh kode:
PS : Ini hanya berfungsi di Python 3.x.
Dalam versi sebelumnya, Anda harus menambahkan
@staticmethod
dekorator secara eksplisit , jika tidakself
argumen wajib.sumber
Saya terkejut tidak ada yang membesarkan Lua. Lua juga menggunakan variabel 'mandiri' namun bisa dihilangkan tetapi masih digunakan. C ++ melakukan hal yang sama dengan 'ini'. Saya tidak melihat alasan untuk harus mendeklarasikan 'diri' di setiap fungsi tetapi Anda masih dapat menggunakannya seperti yang Anda bisa dengan lua dan C ++. Untuk bahasa yang membanggakan diri karena singkat, aneh bahwa itu mengharuskan Anda untuk mendeklarasikan variabel diri.
sumber
Lihatlah contoh berikut, yang dengan jelas menjelaskan tujuan
self
self
digunakan / dibutuhkan untuk membedakan antara instance.Sumber: variabel diri dalam python menjelaskan - Pythontips
sumber
Apakah karena cara python dirancang alternatif tidak akan bekerja. Python dirancang untuk memungkinkan metode atau fungsi didefinisikan dalam konteks di mana keduanya implisit
this
(a-la Java / C ++) atau eksplisit@
(a-la ruby) tidak akan berfungsi. Mari kita ambil contoh dengan pendekatan eksplisit dengan konvensi python:Sekarang
fubar
fungsi tidak akan berfungsi karena akan menganggap ituself
adalah variabel global (danfrob
juga). Alternatifnya adalah dengan mengeksekusi metode dengan ruang lingkup global yang diganti (di manaself
objek).Pendekatan implisit akan menjadi
Ini berarti bahwa
myX
akan ditafsirkan sebagai variabel lokal dalamfubar
(danfrob
juga). Alternatif di sini adalah untuk mengeksekusi metode dengan ruang lingkup lokal diganti yang dipertahankan antara panggilan, tetapi itu akan menghapus kemungkinan variabel metode lokal.Namun situasi saat ini berjalan dengan baik:
di sini ketika disebut sebagai metode
frob
akan menerima objek yang itu disebut melaluiself
parameter, danfubar
masih bisa disebut dengan objek sebagai parameter dan bekerja sama (itu adalah sama denganC.frob
saya pikir).sumber
Dalam
__init__
metode ini, self merujuk ke objek yang baru dibuat; dalam metode kelas lain, ini merujuk pada instance yang metodenya dipanggil.diri, sebagai sebuah nama, hanyalah sebuah konvensi , sebut saja yang Anda inginkan! tetapi ketika menggunakannya, misalnya untuk menghapus objek, Anda harus menggunakan nama yang sama:, di
__del__(var)
manavar
digunakan dalam__init__(var,[...])
Anda harus melihat
cls
juga, untuk memiliki gambaran yang lebih besar . Posting ini bisa membantu.sumber
self bertindak seperti nama objek saat ini atau instance dari kelas.
sumber
self
tidak bisa dihindari.Hanya ada pertanyaan yang harusnya
self
implisit atau eksplisit.Guido van Rossum
terselesaikan pertanyaan ini mengatakan pepatahself
harus tetap .Jadi dimana tempat
self
tinggalnya?Jika kita hanya berpegang pada pemrograman fungsional kita tidak perlu
self
. Setelah kami memasukkan Python OOP, kami menemukanself
sana.Berikut ini adalah kasus penggunaan umum
class C
dengan metode inim1
Program ini akan menampilkan:
Jadi
self
pegang alamat memori instance kelas. Tujuan dariself
akan memegang referensi untuk metode instan dan bagi kita untuk memiliki eksplisit akses ke referensi itu.Perhatikan ada tiga jenis metode kelas:
sumber
dari dokumen ,
sebelum ini cuplikan terkait,
x = MyClass()
sumber
ini adalah referensi eksplisit ke objek instance kelas.
sumber