Hat es einen Vorteil, eine Klasse in einer anderen Klasse in Python zu definieren?
Was ich hier spreche, sind geschachtelte Klassen. Im wesentlichen habe ich zwei Klassen, die ich bin Modellierung. Ein DownloadManager-Klasse und ein DownloadThread Klasse. Die offensichtliche OOP-Konzept ist hier die Zusammensetzung. Jedoch, die Zusammensetzung bedeutet nicht unbedingt, Schachteln, richtig?
Ich habe code, der ungefähr so aussieht:
class DownloadThread:
def foo(self):
pass
class DownloadManager():
def __init__(self):
dwld_threads = []
def create_new_thread():
dwld_threads.append(DownloadThread())
Aber jetzt bin ich Frage mich, ob es eine situation, wo die Verschachtelung besser werden würde. So etwas wie:
class DownloadManager():
class DownloadThread:
def foo(self):
pass
def __init__(self):
dwld_threads = []
def create_new_thread():
dwld_threads.append(DownloadManager.DownloadThread())
InformationsquelleAutor der Frage |
Du musst angemeldet sein, um einen Kommentar abzugeben.
Möchten Sie vielleicht zu tun, wenn die "innere" Klasse ist ein einmalige, die nie verwendet werden, außerhalb der definition der äußeren Klasse. Zum Beispiel die Verwendung einer Metaklasse, manchmal ist es auch praktisch zu tun
statt der Definition einer Metaklasse getrennt, wenn Sie nur es einmal.
Anderen nur die Zeit, die ich verwendet habe, geschachtelte Klassen wie die, die ich verwendet, die äußeren Klasse als namespace-Gruppe eine Reihe von eng verwandten Klassen zusammen:
Dann von einem anderen Modul, können Sie die import-Gruppe und bezeichnen diese als Gruppe.cls1, Gruppe.cls2 etc. Allerdings könnte man argumentieren, dass Sie erreichen genau das gleiche (vielleicht in einer weniger verwirrenden Weise) durch ein Modul.
InformationsquelleAutor der Antwort dF.
Ich weiß nicht, Python, aber deine Frage klingt sehr allgemein. Ignorieren Sie mich, wenn es speziell auf Python.
Klasse Schachtelung ist alles über Rahmen. Wenn Sie denken, dass eine Klasse nur dann einen Sinn, im Kontext des anderen ein, dann wird der erstere ist wahrscheinlich ein guter Kandidat zu werden, eine geschachtelte Klasse.
Es ist ein gemeinsames Muster machen die Helfer-Klassen wie private, geschachtelte Klassen.
InformationsquelleAutor der Antwort André Chalella
Gibt es wirklich keinen Vorteil, dies zu tun, außer wenn Sie sind den Umgang mit metaclasses.
Klasse: suite wirklich nicht, was Sie denken, es ist. Es ist ein komisches Bereich, und es macht seltsame Dinge. Es ist wirklich nicht selbst machen-Klasse! Es ist nur eine Art der Erhebung einiger Variablen - der name der Klasse, die Grundlagen, ein kleines Wörterbuch Attribute und eine Metaklasse.
Den Namen, das Wörterbuch und die Basen sind alle an die Funktion übergeben, wird die Metaklasse, und dann ist es zugewiesen, die variable 'name' in dem Bereich, wo die Klasse: suite war.
Was können Sie gewinnen, indem messing mit Metaklassen, und zwar durch die Verschachtelung von Klassen innerhalb Ihrer Lager-standard-Klassen, ist der code schwerer zu Lesen, schwerer zu verstehen code und seltsame Fehler, die sind furchtbar schwer zu verstehen, ohne eng vertraut mit, warum die 'Klasse' scope ist ganz anders als jede andere python-Umfang.
InformationsquelleAutor der Antwort Jerub
Konnte man mit einer Klasse wie class-generator. Wie (in einigen aus dem Stegreif code 🙂
Ich fühle mich wie wenn Sie diese Funktionalität benötigen, wird es sehr klar. Wenn Sie nicht brauchen, um etwas ähnliches macht, als es wahrscheinlich nicht eine gute Verwendung.
InformationsquelleAutor der Antwort tim.tadh
Nein, Zusammensetzung bedeutet nicht verschachteln.
Würde es Sinn machen, eine geschachtelte Klasse, wenn Sie wollen, um es zu verstecken mehr in den namespace der äußeren Klasse.
Eh, ich sehe keine praktischen nutzen für den Nestbau in Ihrem Fall. Wäre es den code schwerer zu Lesen (verstehen) und es würde auch erhöhen die Einrückung, die machen würde, die Linien kürzer und anfälliger für Risse.
InformationsquelleAutor der Antwort Cristian Ciupitu
Es ist eine weitere Nutzung für geschachtelte Klasse, wenn man rekonstruieren will vererbten Klassen, deren erweiterte Funktionalitäten gekapselt in einem bestimmten geschachtelten Klasse.
Diesem Beispiel sehen:
Beachten Sie, dass im Konstruktor von
foo
die Linieself.a = self.bar()
konstruieren einefoo.bar
wenn das Objekt gebaut wird, ist eigentlich einfoo
- Objekt und einfoo2.bar
Objekt, wenn das Objekt konstruiert wurde, ist eigentlich einfoo2
Objekt.Wenn die Klasse
bar
definiert wurde außerhalb der Klassefoo
statt, sowie die geerbte version (die würde alsbar2
zum Beispiel), dann definiert die neue Klassefoo2
wäre viel schmerzhafter, weil die constuctor derfoo2
brauchen würde, um seine erste Zeile ersetzt durchself.a = bar2()
werden, was bedeutet, neu schreiben die gesamte Konstruktor.InformationsquelleAutor der Antwort