Dalam kode ini:
class A(object):
def __init__(self):
self.x = 'Hello'
def method_a(self, foo):
print self.x + ' ' + foo
... self
variabel mewakili turunan dari objek itu sendiri. Sebagian besar bahasa berorientasi objek melewatkan ini sebagai parameter tersembunyi ke metode yang didefinisikan pada objek; Python tidak. Anda harus mendeklarasikannya secara eksplisit. Saat Anda membuat instance A
kelas dan memanggil metode-metodenya, itu akan diteruskan secara otomatis, seperti di ...
a = A() # We do not pass any argument to the __init__ method
a.method_a('Sailor!') # We only pass a single argument
The __init__
Metode kira-kira apa yang mewakili konstruktor di Python. Saat Anda memanggil A()
Python membuat objek untuk Anda, dan meneruskannya sebagai parameter pertama ke __init__
metode. Parameter tambahan apa pun (misalnya, A(24, 'Hello')
) juga akan dilewatkan sebagai argumen - dalam hal ini menyebabkan pengecualian muncul, karena konstruktor tidak mengharapkannya.
x = 'Hello'
luar tetapi di dalam kelas? apakah itu seperti java di mana itu sama, atau apakah itu menjadi seperti variabel statis yang hanya diinisialisasi sekali?A.x
ataua.x
. Perhatikan bahwa utama itu pada kelas tertentu tidak akan mempengaruhi dasar, sehinggaA.x = 'foo'; a.x = 'bar'; print a.x; print A.x
akan mencetakbar
kemudianfoo
self
, hanya dengan konvensi.object
deklarasi kelas? Saya perhatikan beberapa kelas memiliki ini dan beberapa tidakobject
karena itu terjadi secara default.Yap, Anda benar, ini adalah konstruksi oop.
__init__
adalah konstruktor untuk suatu kelas. Theself
parameter mengacu pada contoh objek (sepertithis
di C ++).The
__init__
Metode dipanggil ketika memori untuk objek dialokasikan:Penting untuk menggunakan
self
parameter di dalam metode objek jika Anda ingin mempertahankan nilai dengan objek. Jika, misalnya, Anda menerapkan__init__
metode seperti ini:Parameter Anda
x
dany
akan disimpan dalam variabel di stack dan akan dibuang ketika metode init keluar dari ruang lingkup. Mengatur variabel-variabel itu sebagaiself._x
danself._y
menetapkan variabel-variabel tersebut sebagai anggotaPoint
objek (dapat diakses selama masa objek).sumber
self
berada di konstruktor? Mengapa Anda bahkan harus menentukannya, bukankah akan lebih baik jika itu tersirat?Contoh ilustrasi singkat
Dengan harapan ini mungkin sedikit membantu, inilah contoh sederhana yang saya gunakan untuk memahami perbedaan antara variabel yang dideklarasikan di dalam kelas, dan variabel yang dideklarasikan di dalam suatu
__init__
fungsi:Keluaran:
sumber
__init__
adalah apa yang diteruskan ke instance kelas, bukan variabel 'statis' dari kelas itu sendiri yang memiliki nama yang sama ...Pendeknya:
self
seperti yang disarankan, mengacu pada dirinya sendiri - objek yang disebut metode. Artinya, jika Anda memiliki objek N memanggil metode, makaself.a
akan merujuk ke contoh terpisah dari variabel untuk masing-masing objek N. Bayangkan N salinan variabela
untuk setiap objek__init__
adalah apa yang disebut sebagai konstruktor dalam bahasa OOP lainnya seperti C ++ / Java. Ide dasarnya adalah bahwa itu adalah metode khusus yang secara otomatis dipanggil ketika objek Kelas itu dibuatsumber
__init__
tidak bertindak seperti konstruktor. Anda harus meneruskan "diri" ke fungsi kelas apa pun sebagai argumen pertama jika Anda ingin mereka berperilaku sebagai metode non-statis. "Diri" adalah variabel instan untuk kelas Anda.sumber
Coba kode ini. Semoga ini membantu banyak programmer C seperti saya untuk Belajar Py.
Keluaran:
Jay
Sum = 5
Doc - Inside Class
Doc - __init__ Constructor
Doc - Inside Show
Destructor Deleting object - Jay
sumber
Objek kelas mendukung dua jenis operasi: referensi atribut dan instantiasi
Referensi atribut menggunakan sintaksis standar yang digunakan untuk semua referensi atribut dengan Python: obj.name. Nama atribut yang valid adalah semua nama yang ada di namespace kelas ketika objek kelas dibuat. Jadi, jika definisi kelas tampak seperti ini:
kemudian
MyClass.i
danMyClass.f
adalah referensi atribut yang valid, masing-masing mengembalikan integer dan fungsi objek. Atribut kelas juga dapat ditetapkan, sehingga Anda dapat mengubah nilaiMyClass.i
berdasarkan penugasan.__doc__
juga merupakan atribut yang valid, mengembalikan docstring milik kelas: "Kelas contoh sederhana".Instansiasi kelas menggunakan notasi fungsi. Hanya berpura-pura bahwa objek kelas adalah fungsi tanpa parameter yang mengembalikan instance baru dari kelas. Sebagai contoh:
The Instansiasi Operasi ( “memanggil” objek kelas) menciptakan objek kosong. Banyak kelas suka membuat objek dengan instance yang disesuaikan dengan kondisi awal tertentu. Oleh karena itu kelas dapat mendefinisikan metode khusus yang dinamai
__init__()
, seperti ini:Ketika sebuah kelas mendefinisikan sebuah
__init__()
metode, instantiasi kelas secara otomatis memanggil__init__()
instance kelas yang baru dibuat. Jadi dalam contoh ini, contoh baru yang diinisialisasi dapat diperoleh dengan:Tentu saja,
__init__()
metode ini mungkin memiliki argumen untuk fleksibilitas yang lebih besar. Dalam hal itu, argumen yang diberikan kepada operator instantiasi kelas diteruskan ke__init__()
. Sebagai contoh,Diambil dari dokumentasi resmi yang paling membantu saya pada akhirnya.
Ini contoh saya
Saat Anda membuat instance dari tagihan kelas:
Anda mendapatkan:
sumber
Kesulitan memahami ini sendiri. Bahkan setelah membaca jawabannya di sini.
Untuk memahami
__init__
metode ini, Anda perlu memahami diri sendiri.Parameter diri
Argumen yang diterima oleh
__init__
metode ini adalah:Tapi kami hanya benar-benar memberikan dua argumen:
Dari mana datangnya argumen tambahan?
Ketika kita mengakses atribut dari suatu objek, kita melakukannya dengan nama (atau dengan referensi). Di sini instance adalah referensi ke objek baru kami. Kami mengakses metode printargs dari objek instance menggunakan instance.printargs.
Untuk mengakses atribut objek dari dalam
__init__
metode, kita perlu referensi ke objek.Setiap kali suatu metode dipanggil, referensi ke objek utama dilewatkan sebagai argumen pertama. Dengan konvensi, Anda selalu menyebut argumen pertama ini untuk metode Anda sendiri.
Ini berarti dalam
__init__
metode yang dapat kita lakukan:Di sini kita mengatur atribut pada objek. Anda dapat memverifikasi ini dengan melakukan hal berikut:
nilai-nilai seperti ini dikenal sebagai atribut objek. Di sini
__init__
metode menetapkan atribut arg1 dan arg2 dari instance.sumber: http://www.voidspace.org.uk/python/articles/OOP.shtml#the-init-method
sumber
perhatikan bahwa
self
sebenarnya bisa berupa pengidentifikasi python yang valid. Sebagai contoh, kita dapat dengan mudah menulis, dari contoh Chris B:dan itu akan bekerja sama persis. Namun disarankan untuk menggunakan diri sendiri karena pythoner lain akan mengenalinya lebih mudah.
sumber
Pada dasarnya, Anda perlu menggunakan kata kunci 'mandiri' saat menggunakan variabel dalam berbagai fungsi dalam kelas yang sama. Sedangkan untuk init , ini digunakan untuk mengatur nilai-nilai default jika tidak ada fungsi lain dari dalam kelas yang dipanggil.
sumber
__init__
pada dasarnya adalah fungsi yang akan "menginisialisasi" / "mengaktifkan" properti kelas untuk objek tertentu, setelah dibuat dan dicocokkan dengan kelas yang sesuai ..self
mewakili objek yang akan mewarisi properti tersebut.sumber
'Diri' adalah referensi ke instance kelas
Sekarang kita dapat membuat instance dari foo dan memanggil metode di atasnya, parameter self ditambahkan oleh Python dalam kasus ini:
Tetapi itu dapat diteruskan juga jika pemanggilan metode tidak dalam konteks turunan kelas, kode di bawah ini melakukan hal yang sama
Menariknya nama variabel 'diri' hanyalah sebuah konvensi. Definisi di bawah ini akan bekerja persis sama. Setelah mengatakan bahwa itu adalah konvensi yang sangat kuat yang harus diikuti selalu , tetapi ia mengatakan sesuatu tentang sifat fleksibel bahasa
sumber
s
) menunjukkan fleksibilitas python.Hanya demo untuk pertanyaan itu.
sumber
Dalam kode ini:
Di sini
__init__
bertindak sebagai konstruktor untuk kelas dan ketika suatu objek dipakai, fungsi ini disebut.self
mewakili objek instantiating.Hasil dari pernyataan di atas adalah sebagai berikut:
sumber
Argumen pertama dari setiap metode kelas, termasuk init, selalu merupakan referensi ke instance kelas saat ini . Dengan konvensi, argumen ini selalu dinamai
self
. Dalam metode init,self
merujuk ke objek yang baru dibuat; dalam metode kelas lain, ini merujuk pada instance yang metodenya dipanggil.Python tidak memaksa Anda untuk menggunakan " diri ". Anda dapat memberikan nama apa saja yang Anda inginkan. Tapi ingat argumen pertama dalam definisi metode adalah referensi ke objek . Python menambahkan
self
argumen ke daftar untuk Anda; Anda tidak perlu memasukkannya saat Anda memanggil metode. jika Anda tidak menyediakan metode init sendiri maka Anda akan mendapatkan kesalahaninit
kependekan dari inisialisasi. Ini adalah konstruktor yang dipanggil ketika Anda membuat instance kelas dan itu tidak perlu . Tapi biasanya itu praktik kami untuk menulis metode init untuk menetapkan keadaan default objek. Jika Anda tidak ingin mengatur keadaan objek pada awalnya maka Anda tidak perlu menulis metode ini.sumber
sumber
Contoh yang diberikan tidak benar, jadi izinkan saya membuat contoh yang benar berdasarkan itu:
Ketika kita membuat instance objek,
__init__
dipanggil untuk mengkustomisasi objek setelah objek dibuat. Artinya, ketika kita sebutSomeObject
dengan'blah'
di bawah ini (yang bisa apa saja), hal itu akan diteruskan ke__init__
fungsi sebagai argumen,blah
:The
self
argumen adalah contohSomeObject
yang akan ditugaskan untukan_object
.Kemudian, kita mungkin ingin memanggil metode pada objek ini:
Melakukan pencarian putus-putus, yaitu,
an_object.method
, mengikat instance ke instance fungsi, dan metode (seperti disebut di atas) sekarang menjadi metode "terikat" - yang berarti kita tidak perlu secara eksplisit meneruskan instance ke pemanggilan metode. .Pemanggilan metode mendapatkan instance karena terikat pada pencarian putus-putus, dan ketika dipanggil, maka jalankan kode apa pun yang diprogram untuk dijalankan.
self
Argumen yang disahkan secara implisit disebutself
dengan konvensi. Kami bisa menggunakan nama Python legal lainnya, tetapi Anda mungkin akan mendapatkan tar dan bulu oleh programmer Python lain jika Anda mengubahnya ke sesuatu yang lain.__init__
adalah metode khusus, yang didokumentasikan dalam dokumentasi datamodel Python . Ini dipanggil segera setelah instance dibuat (biasanya via__new__
- meskipun__new__
tidak diperlukan kecuali Anda mensubklasifikasikan datatype yang tidak dapat diubah).sumber
Di sini, pria itu telah menulis dengan cukup baik dan sederhana: https://www.jeffknupp.com/blog/2014/06/18/improve-your-python-python-python-classes-and-object-oriented-programming/
Baca tautan di atas sebagai referensi untuk ini:
sumber