Lebih lanjut menggemakan saran Mike dan Alex dan menambahkan warna saya sendiri ...
Menggunakan atribut instance adalah tipikal ... Python yang lebih idiomatis. Atribut kelas tidak terlalu sering digunakan, karena kasus penggunaannya bersifat spesifik. Hal yang sama juga berlaku untuk metode statis dan kelas vs. metode "normal". Mereka adalah konstruksi khusus yang menangani kasus penggunaan tertentu, jika tidak, kode itu dibuat oleh programmer yang menyimpang yang ingin menunjukkan bahwa mereka tahu beberapa sudut yang tidak jelas dari pemrograman Python.
Alex menyebutkan dalam balasannya bahwa akses akan (sedikit) lebih cepat karena satu tingkat pencarian yang lebih sedikit ... izinkan saya menjelaskan lebih lanjut bagi mereka yang belum tahu tentang cara kerjanya. Ini sangat mirip dengan akses variabel - urutan pencariannya adalah:
- penduduk setempat
- nonlokal
- global
- bawaan
Untuk akses atribut, urutannya adalah:
- contoh
- kelas
- kelas dasar yang ditentukan oleh MRO (urutan resolusi metode)
Kedua teknik bekerja secara "inside-out", yang berarti sebagian besar objek lokal diperiksa terlebih dahulu, kemudian lapisan luar diperiksa secara berurutan.
Dalam contoh Anda di atas, misalkan Anda mencari path
atribut. Ketika menemukan referensi seperti " self.path
", Python akan melihat atribut instance terlebih dahulu untuk kecocokan. Ketika gagal, itu memeriksa kelas dari mana objek itu dibuat. Akhirnya, itu akan mencari kelas dasar. Seperti yang dikatakan Alex, jika atribut Anda ditemukan dalam instans, atribut tersebut tidak perlu mencari di tempat lain, sehingga menghemat sedikit waktu Anda.
Namun, jika Anda bersikeras menggunakan atribut kelas, Anda memerlukan pencarian ekstra tersebut. Atau , alternatif Anda yang lain adalah merujuk ke objek melalui kelas alih-alih instance, misalnya, MyController.path
alih-alihself.path
. Itu adalah pencarian langsung yang akan mengatasi pencarian yang ditangguhkan, tetapi seperti yang disebutkan alex di bawah ini, ini adalah variabel global, jadi Anda kehilangan sedikit yang Anda pikir akan disimpan (kecuali jika Anda membuat referensi lokal ke nama kelas [global] ).
Intinya adalah Anda harus menggunakan atribut instance hampir sepanjang waktu. Namun, ada kalanya atribut kelas adalah alat yang tepat untuk pekerjaan itu. Kode yang menggunakan keduanya pada saat yang sama akan membutuhkan ketekunan yang paling tinggi, karena menggunakan self
hanya akan memberi Anda objek atribut instance dan akses bayangan ke atribut kelas dengan nama yang sama. Dalam kasus ini, Anda harus menggunakan akses atribut dengan nama kelas untuk mereferensikannya.