Ich spreche hier von verschachtelten Klassen. Im Wesentlichen habe ich zwei Klassen, die ich modelliere. Eine DownloadManager-Klasse und eine DownloadThread-Klasse. Das offensichtliche OOP-Konzept ist hier die Komposition. Komposition bedeutet jedoch nicht unbedingt Verschachtelung, oder?
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 frage ich mich, ob es eine Situation gibt, in der das Verschachteln besser wäre. Etwas wie:
class DownloadManager():
class DownloadThread:
def foo(self):
pass
def __init__(self):
dwld_threads = []
def create_new_thread():
dwld_threads.append(DownloadManager.DownloadThread())
Ich kenne Python nicht, aber Ihre Frage scheint sehr allgemein zu sein. Ignoriere mich, wenn es spezifisch für Python ist.
Beim Verschachteln von Klassen dreht sich alles um den Umfang. Wenn Sie der Meinung sind, dass eine Klasse nur im Kontext einer anderen sinnvoll ist, ist die erstere wahrscheinlich ein guter Kandidat, um eine verschachtelte Klasse zu werden.
Es ist ein gängiges Muster, Hilfsklassen zu privaten, verschachtelten Klassen zu machen.
quelle
private
Klassen gilt in Python nicht so häufig, aber ein impliziter Verwendungsbereich gilt definitiv.I do not know python ...
?Es gibt eine andere Verwendung für verschachtelte Klassen, wenn geerbte Klassen erstellt werden sollen, deren erweiterte Funktionen in einer bestimmten verschachtelten Klasse gekapselt sind.
Siehe dieses Beispiel:
Beachten Sie, dass im Konstruktor von
foo
die Linieself.a = self.bar()
a erstellt,foo.bar
wenn das zu erstellende Objekt tatsächlich einfoo
Objekt ist, und einfoo2.bar
Objekt, wenn das zu erstellende Objekt tatsächlich einfoo2
Objekt ist.Wenn die Klasse
bar
außerhalb der Klasse definiert wurdefoo
stattdessen sowie seine geerbten Version (die aufgerufen wird , würdebar2
zum Beispiel), dann die neue Klasse zu definierenfoo2
wäre viel schmerzhafter, weil der Konstruktor vonfoo2
müßte seine erste Linie ersetzt hatself.a = bar2()
, Dies bedeutet, dass der gesamte Konstruktor neu geschrieben wird.quelle
Dies hat wirklich keinen Vorteil, es sei denn, Sie haben es mit Metaklassen zu tun.
Die Klasse: Suite ist wirklich nicht das, was Sie denken. Es ist ein seltsamer Bereich, und es macht seltsame Dinge. Es macht wirklich nicht einmal eine Klasse! Es ist nur eine Möglichkeit, einige Variablen zu sammeln - den Namen der Klasse, die Basen, ein kleines Wörterbuch mit Attributen und eine Metaklasse.
Der Name, das Wörterbuch und die Basen werden alle an die Funktion übergeben, die die Metaklasse ist, und dann wird sie der Variablen 'name' in dem Bereich zugewiesen, in dem sich die class: suite befand.
Was Sie durch das Durcheinander mit Metaklassen und durch das Verschachteln von Klassen in Ihren Standardklassen erreichen können, ist schwerer zu lesender Code, schwerer zu verstehender Code und seltsame Fehler, die furchtbar schwer zu verstehen sind, ohne genau zu wissen, warum die 'Klasse' Der Gültigkeitsbereich unterscheidet sich grundlegend von allen anderen Python-Gültigkeitsbereichen.
quelle
except myInstanceObj.CustomError, e:
Sie könnten eine Klasse als Klassengenerator verwenden. Wie (in einigen aus dem Manschettencode :)
Ich denke, wenn Sie diese Funktionalität benötigen, wird es Ihnen sehr klar sein. Wenn Sie nichts Ähnliches tun müssen, ist dies wahrscheinlich kein guter Anwendungsfall.
quelle
Nein, Komposition bedeutet nicht Verschachtelung. Es wäre sinnvoll, eine verschachtelte Klasse zu haben, wenn Sie sie mehr im Namespace der äußeren Klasse ausblenden möchten.
Jedenfalls sehe ich in Ihrem Fall keinen praktischen Nutzen für das Verschachteln. Dies würde das Lesen (Verstehen) des Codes erschweren und die Einrückung erhöhen, wodurch die Zeilen kürzer und anfälliger für das Teilen würden.
quelle