Saya mengalami kesulitan memahami Inisialisasi kelas.
Apa gunanya dan bagaimana kita tahu apa yang harus disertakan di dalamnya? Apakah menulis di kelas memerlukan jenis pemikiran yang berbeda versus membuat fungsi (saya pikir saya bisa membuat fungsi dan kemudian membungkusnya di kelas sehingga saya bisa menggunakannya kembali. Akankah itu berhasil?)
Berikut contohnya:
class crawler:
# Initialize the crawler with the name of database
def __init__(self,dbname):
self.con=sqlite.connect(dbname)
def __del__(self):
self.con.close()
def dbcommit(self):
self.con.commit()
Atau contoh kode lain:
class bicluster:
def __init__(self,vec,left=None,right=None,distance=0.0,id=None):
self.left=left
self.right=right
self.vec=vec
self.id=id
self.distance=distance
Ada begitu banyak kelas yang __init__
saya temui ketika mencoba membaca kode orang lain, tetapi saya tidak memahami logika dalam membuatnya.
Jawaban:
Dengan apa yang Anda tulis, Anda kehilangan bagian penting dari pemahaman: perbedaan antara kelas dan objek.
__init__
tidak menginisialisasi kelas, itu menginisialisasi sebuah instance dari kelas atau objek. Setiap anjing memiliki warna, tetapi anjing sebagai kelas tidak. Setiap anjing memiliki empat kaki atau lebih sedikit, tetapi kelas anjing tidak. Kelas adalah konsep dari suatu objek. Saat Anda melihat Fido dan Spot, Anda mengenali kemiripan mereka, sifat anjingnya. Itu kelasnya.Saat Anda berkata
Maksudmu, Fido adalah anjing coklat dengan 4 kaki sedangkan Spot agak cacat dan sebagian besar berwarna kuning. The
__init__
fungsi disebut konstruktor, atau initializer, dan secara otomatis dipanggil ketika Anda membuat contoh baru dari sebuah kelas. Di dalam fungsi itu, objek yang baru dibuat ditugaskan ke parameterself
. Notasiself.legs
adalah atribut yang dipanggillegs
dari objek dalam variabelself
. Atribut adalah sejenis variabel, tetapi mereka menggambarkan status suatu objek, atau tindakan (fungsi) tertentu yang tersedia untuk objek tersebut.Namun, perhatikan bahwa Anda tidak menetapkan
colour
doghood itu sendiri - ini adalah konsep abstrak. Ada atribut yang masuk akal di kelas. Misalnya,population_size
adalah salah satunya - tidak masuk akal untuk menghitung Fido karena Fido selalu satu. Masuk akal untuk menghitung anjing. Katakanlah ada 200 juta anjing di dunia. Itu milik kelas Anjing. Fido tidak ada hubungannya dengan angka 200 juta, begitu juga dengan Spot. Ini disebut "atribut kelas", sebagai lawan dari "atribut contoh" yang adacolour
atau dilegs
atasnya.Sekarang, untuk sesuatu yang lebih sedikit anjing dan lebih terkait dengan pemrograman. Seperti yang saya tulis di bawah ini, kelas untuk menambahkan sesuatu tidak masuk akal - kelas apa itu? Kelas dalam Python terdiri dari kumpulan data berbeda, yang berperilaku serupa. Kelas anjing terdiri dari Fido dan Spot serta 199999999998 hewan sejenis lainnya, semuanya kencing di tiang lampu. Terdiri dari apakah kelas untuk menambahkan sesuatu? Berdasarkan data apa yang melekat pada mereka, mereka berbeda? Dan tindakan apa yang mereka bagi?
Namun, angka ... itu adalah topik yang lebih menarik. Katakanlah, Integers. Ada banyak dari mereka, lebih banyak dari pada anjing. Saya tahu bahwa Python sudah memiliki bilangan bulat, tapi mari kita bermain bodoh dan "menerapkan" mereka lagi (dengan menipu dan menggunakan bilangan bulat Python).
Jadi, Integer adalah sebuah kelas. Mereka memiliki beberapa data (nilai), dan beberapa perilaku ("tambahkan saya ke nomor lain ini"). Mari tunjukkan ini:
Ini agak rapuh (kami asumsikan
other
akan menjadi MyInteger), tetapi kami akan mengabaikannya sekarang. Dalam kode nyata, kami tidak akan; kami akan mengujinya untuk memastikan, dan bahkan mungkin memaksanya ("Anda bukan bilangan bulat? Astaga, Anda memiliki 10 nanodetik untuk menjadi satu! 9 ... 8 ....")Kita bahkan bisa mendefinisikan pecahan. Pecahan juga tahu cara menjumlahkan dirinya sendiri.
Bahkan ada lebih banyak pecahan daripada bilangan bulat (tidak juga, tetapi komputer tidak tahu itu). Mari buat dua:
Anda sebenarnya tidak mendeklarasikan apa pun di sini. Atribut seperti variabel jenis baru. Variabel normal hanya memiliki satu nilai. Katakanlah Anda menulis
colour = "grey"
. Anda tidak dapat memiliki variabel lain bernamacolour
yang"fuchsia"
- tidak di tempat yang sama dalam kode.Array memecahkannya sampai tingkat tertentu. Jika Anda mengatakan
colour = ["grey", "fuchsia"]
, Anda telah menumpuk dua warna ke dalam variabel, tetapi Anda membedakannya dengan posisinya (0, atau 1, dalam kasus ini).Atribut adalah variabel yang terikat pada suatu objek. Seperti halnya array, kita dapat memiliki banyak
colour
variabel, pada anjing yang berbeda . Jadi,fido.colour
adalah satu variabel, tetapi variabelspot.colour
lainnya. Yang pertama terikat ke objek dalam variabelfido
; yang keduaspot
,. Sekarang, saat Anda memanggilDog(4, "brown")
, atauthree.add(five)
, akan selalu ada parameter tak terlihat, yang akan ditetapkan ke ekstra yang menggantung di depan daftar parameter. Ini disebut secara konvensionalself
, dan akan mendapatkan nilai benda di depan titik. Jadi, di dalam Dog__init__
(konstruktor),self
akan menjadi apa pun yang Anjing baru itu kelak; insideMyInteger
'sadd
,self
akan terikat ke objek dalam variabelthree
. Jadi,three.value
akan menjadi variabel yang sama di luaradd
, sepertiself.value
di dalamadd
.Jika saya katakan
the_mangy_one = fido
, saya akan mulai mengacu pada objek yang dikenalfido
dengan nama lain. Mulai sekarang,fido.colour
variabel yang sama persis denganthe_mangy_one.colour
.Jadi, hal-hal di dalam file
__init__
. Anda dapat menganggapnya sebagai catatan di dalam akta kelahiran Anjing.colour
dengan sendirinya adalah variabel acak, bisa berisi apa saja.fido.colour
atauself.colour
seperti kolom formulir pada lembar identitas Anjing; dan__init__
petugas mengisinya untuk pertama kali.Ada yang lebih jelas?
EDIT : Memperluas komentar di bawah ini:
Maksud Anda daftar objek , bukan?
Pertama-tama,
fido
sebenarnya bukanlah sebuah objek. Ini adalah variabel, yang saat ini berisi objek, seperti yang Anda katakanx = 5
,x
adalah variabel yang saat ini berisi angka lima. Jika Anda kemudian berubah pikiran, Anda dapat melakukannyafido = Cat(4, "pleasing")
(selama Anda telah membuat kelasCat
), danfido
sejak saat itu akan "berisi" objek kucing. Jika Anda melakukannyafido = x
, maka itu akan berisi angka lima, dan bukan objek hewan sama sekali.Sebuah kelas dengan sendirinya tidak mengetahui kejadiannya kecuali Anda secara khusus menulis kode untuk melacaknya. Misalnya:
Di sini,
census
adalah atribut tingkatCat
kelas dari kelas.Perhatikan bahwa Anda tidak akan mendapatkan
[fluffy, sparky]
. Itu hanya nama variabel. Jika Anda ingin kucing itu sendiri memiliki nama, Anda harus membuat atribut terpisah untuk namanya, lalu mengganti__str__
metode untuk mengembalikan nama ini. Tujuan metode ini (mis. Fungsi terikat kelas, sepertiadd
atau__init__
) adalah untuk menjelaskan cara mengonversi objek menjadi string, seperti saat Anda mencetaknya.sumber
Untuk menyumbangkan 5 sen saya untuk penjelasan menyeluruh dari Amadan .
Dimana kelas adalah deskripsi "dari suatu tipe" secara abstrak. Objek adalah realisasinya: makhluk bernapas yang hidup. Dalam dunia yang berorientasi objek, terdapat ide-ide utama yang hampir dapat Anda sebut sebagai esensi dari segalanya. Mereka:
Objek memiliki satu, atau lebih karakteristik (= Atribut) dan perilaku (= Metode). Perilaku tersebut sebagian besar tergantung pada karakteristiknya. Kelas menentukan apa yang harus dicapai perilaku secara umum, tetapi selama kelas tidak direalisasikan (dipakai) sebagai objek, ia tetap merupakan konsep abstrak dari suatu kemungkinan. Izinkan saya mengilustrasikan dengan bantuan "warisan" dan "polimorfisme".
Beberapa karakteristik mendefinisikan manusia. Tetapi setiap kebangsaan agak berbeda. Jadi "tipe-nasional" adalah semacam Manusia dengan ekstra. "Orang Amerika" adalah sejenis "Manusia" dan mewarisi beberapa karakteristik abstrak dan perilaku dari tipe manusia (kelas dasar): itu warisan. Jadi semua Manusia bisa tertawa dan minum, oleh karena itu semua kelas anak juga bisa! Warisan (2).
Tetapi karena mereka semua dari jenis yang sama (Jenis / kelas-dasar: Manusia) Anda terkadang dapat menukarnya: lihat loop-for di bagian akhir. Tetapi mereka akan mengekspos karakteristik individu, itulah Polimorfisme (3).
Jadi, setiap manusia memiliki minuman_ favorit, tetapi setiap negara cenderung memilih minuman khusus. Jika Anda membuat subkelas kebangsaan dari tipe Manusia, Anda dapat menimpa perilaku yang diwariskan seperti yang telah saya tunjukkan di atas dengan
drink()
Metode. Tapi itu masih di level kelas dan karena itu masih generalisasi.instantiates kelas bahasa Jerman dan saya "mengubah" karakteristik default di awal. (Tetapi jika Anda memanggil hans.drink ('Milk') dia masih akan mencetak "Saya butuh lebih banyak bir" - bug yang jelas ... atau mungkin itulah yang akan saya sebut fitur jika saya akan menjadi Karyawan di Perusahaan yang lebih besar. ;-)! )
Ciri-ciri suatu tipe misalnya Jerman (hans) biasanya ditentukan melalui konstruktor (dalam python :)
__init__
pada saat pembuatan contoh. Ini adalah titik di mana Anda mendefinisikan kelas untuk menjadi objek. Bisa dibilang menghembuskan nafas ke dalam konsep abstrak (kelas) dengan mengisinya dengan karakteristik individu dan menjadi sebuah obyek.Tapi karena setiap objek adalah turunan dari kelas mereka berbagi semua tipe-karakteristik dasar dan beberapa perilaku. Ini adalah keuntungan utama dari konsep berorientasi objek.
Untuk melindungi karakteristik masing-masing objek, Anda merangkumnya - berarti Anda mencoba menggabungkan perilaku dan karakteristik dan membuatnya sulit untuk memanipulasinya dari luar objek. Itu Enkapsulasi (1)
sumber
Ini hanya untuk menginisialisasi variabel instance.
Misalnya, buat
crawler
instance dengan nama database tertentu (dari contoh Anda di atas).sumber
left=None
left akan diinisialisasiNone
jika setelah pembuatanleft
parameter tidak ditentukan.left = foo
akan berhasil - sekali. Inti dari kelas adalah melakukan sesuatu yang masuk akal untuk setiap perbedaancrawler
. Kelas bukanlah fungsi, atau sesuatu yang dapat dibandingkan dengan fungsi (yah, tidak sampai Anda jauh lebih mahir dan masuk ke dalam pemrograman fungsional, tapi itu hanya akan membingungkan Anda sekarang). Baca jawaban saya untuk kelas yang sebenarnya - Anda masih belum mengerti.Sepertinya Anda perlu menggunakan
__init__
Python jika Anda ingin menginisialisasi atribut yang bisa berubah dari instance Anda dengan benar.Lihat contoh berikut:
Ini sangat berbeda di Java di mana setiap atribut secara otomatis diinisialisasi dengan nilai baru:
menghasilkan keluaran yang kita harapkan secara intuitif:
Tetapi jika Anda mendeklarasikan
attr
sebagaistatic
, itu akan bertindak seperti Python:sumber
Berikut dengan contoh mobil Anda : ketika Anda mendapatkan mobil, Anda tidak mendapatkan mobil sembarangan, maksud saya, Anda memilih warna, merek, jumlah kursi, dll. Dan beberapa barang juga "diinisialisasi" tanpa Anda pilih untuk itu, seperti nomor roda atau nomor registrasi.
Jadi, dalam
__init__
metode Anda menentukan atribut dari instance yang Anda buat. Jadi kalau kita mau mobil Renault biru, untuk 2 orang kita inisialisasi atau contohCar
seperti:Dengan cara ini, kami membuat instance
Car
kelas. The__init__
adalah salah satu yang menangani atribut spesifik kita (seperticolor
ataubrand
) dan menghasilkan atribut lain, sepertiregistration_number
.__init__
metode inisumber
Kelas adalah objek dengan atribut (status, karakteristik) dan metode (fungsi, kapasitas) yang spesifik untuk objek tersebut (seperti warna putih dan kekuatan terbang, masing-masing, untuk bebek).
Saat Anda membuat instance kelas, Anda dapat memberinya beberapa kepribadian awal (status atau karakter seperti nama dan warna gaunnya untuk bayi yang baru lahir). Anda melakukan ini dengan
__init__
.Pada dasarnya
__init__
menyetel karakteristik instance secara otomatis saat Anda memanggilinstance = MyClass(some_individual_traits)
.sumber
The
__init__
Fungsi adalah menyiapkan semua variabel anggota di kelas. Jadi, setelah bicluster Anda dibuat, Anda dapat mengakses anggota tersebut dan mendapatkan nilainya kembali:Lihat Dokumen Python untuk beberapa info. Anda akan ingin mengambil buku tentang konsep OO untuk terus belajar.
sumber
Dalam contoh di atas kami menggunakan spesies sebagai global karena akan selalu sama (Jenis konstanta dapat Anda katakan). ketika Anda memanggil
__init__
metode maka semua variabel di dalamnya__init__
akan dimulai (misalnya: breed, name).jika Anda mencetak contoh di atas dengan menelepon di bawah seperti ini
Itu berarti itu hanya akan diinisialisasi selama pembuatan objek. jadi apa pun yang ingin Anda deklarasikan sebagai konstan jadikan sebagai global dan apa pun yang berubah digunakan
__init__
sumber