Yang saya bicarakan di sini adalah kelas bersarang. Pada dasarnya, saya memiliki dua kelas yang saya modelkan. Kelas DownloadManager dan kelas DownloadThread. Konsep OOP yang jelas di sini adalah komposisi. Namun, komposisi tidak selalu berarti bersarang, bukan?
Saya memiliki kode yang terlihat seperti ini:
class DownloadThread:
def foo(self):
pass
class DownloadManager():
def __init__(self):
dwld_threads = []
def create_new_thread():
dwld_threads.append(DownloadThread())
Tapi sekarang saya bertanya-tanya apakah ada situasi di mana bersarang akan lebih baik. Sesuatu seperti:
class DownloadManager():
class DownloadThread:
def foo(self):
pass
def __init__(self):
dwld_threads = []
def create_new_thread():
dwld_threads.append(DownloadManager.DownloadThread())
Saya tidak tahu Python, tapi pertanyaan Anda sepertinya sangat umum. Abaikan saya jika itu khusus untuk Python.
Kelas bersarang adalah tentang ruang lingkup. Jika Anda berpikir bahwa satu kelas hanya akan masuk akal dalam konteks kelas lain, maka kelas yang pertama mungkin adalah kandidat yang baik untuk menjadi kelas bertingkat.
Ini adalah pola umum yang membuat kelas pembantu sebagai kelas privat, kelas bersarang.
sumber
private
kelas tidak banyak diterapkan di Python, tetapi cakupan penggunaan tersirat masih berlaku.Ada penggunaan lain untuk kelas bersarang, ketika seseorang ingin membangun kelas yang diwariskan yang fungsionalitasnya ditingkatkan dienkapsulasi dalam kelas bersarang tertentu.
Lihat contoh ini:
Perhatikan bahwa dalam konstruktor dari
foo
, garisself.a = self.bar()
akan membangunfoo.bar
ketika objek yang sedang dibangun sebenarnya adalahfoo
objek, danfoo2.bar
objek saat objek yang sedang dibangun sebenarnya adalahfoo2
objek.Jika kelas
bar
didefinisikan di luar kelasfoo
sebagai gantinya, serta versi yang diwariskan (yang akan dipanggilbar2
sebagai contoh), maka mendefinisikan kelas barufoo2
akan jauh lebih menyakitkan, karena penyusun darifoo2
harus mengganti baris pertamanya denganself.a = bar2()
, yang menyiratkan penulisan ulang seluruh konstruktor.sumber
Tidak ada manfaatnya melakukan ini, kecuali jika Anda berurusan dengan metaclass.
kelas: suite sebenarnya tidak seperti yang Anda pikirkan. Ini adalah ruang lingkup yang aneh, dan melakukan hal-hal aneh. Itu benar-benar bahkan tidak membuat kelas! Ini hanyalah cara untuk mengumpulkan beberapa variabel - nama kelas, basis, kamus kecil atribut, dan metaclass.
Nama, kamus, dan basis semuanya diteruskan ke fungsi yang merupakan metaclass, dan kemudian ditugaskan ke variabel 'name' dalam ruang lingkup di mana kelas: suite itu.
Apa yang bisa Anda peroleh dengan mengotak-atik metaclass, dan memang dengan menumpuk kelas dalam kelas standar stok Anda, lebih sulit untuk membaca kode, lebih sulit untuk memahami kode, dan kesalahan aneh yang sangat sulit untuk dipahami tanpa terlalu akrab dengan mengapa 'kelas' lingkup sama sekali berbeda dengan lingkup python lainnya.
sumber
except myInstanceObj.CustomError, e:
Anda bisa menggunakan kelas sebagai generator kelas. Seperti (di beberapa kode manset :)
Saya merasa ketika Anda membutuhkan fungsi ini, itu akan sangat jelas bagi Anda. Jika Anda tidak perlu melakukan sesuatu yang serupa daripada itu mungkin bukan kasus penggunaan yang baik.
sumber
Tidak, komposisi tidak berarti bersarang. Masuk akal untuk memiliki kelas bersarang jika Anda ingin lebih menyembunyikannya di ruang nama kelas luar.
Bagaimanapun, saya tidak melihat penggunaan praktis untuk bersarang dalam kasus Anda. Ini akan membuat kode lebih sulit untuk dibaca (dipahami) dan itu juga akan meningkatkan lekukan yang akan membuat garis lebih pendek dan lebih mudah terpecah.
sumber