Mówię tutaj o klasach zagnieżdżonych. Zasadniczo mam dwie klasy, które modeluję. Klasa DownloadManager i klasa DownloadThread. Oczywistą koncepcją OOP jest tutaj kompozycja. Jednak kompozycja niekoniecznie oznacza zagnieżdżanie, prawda?
Mam kod, który wygląda mniej więcej tak:
class DownloadThread:
def foo(self):
pass
class DownloadManager():
def __init__(self):
dwld_threads = []
def create_new_thread():
dwld_threads.append(DownloadThread())
Ale teraz zastanawiam się, czy jest sytuacja, w której zagnieżdżanie byłoby lepsze. Coś jak:
class DownloadManager():
class DownloadThread:
def foo(self):
pass
def __init__(self):
dwld_threads = []
def create_new_thread():
dwld_threads.append(DownloadManager.DownloadThread())
Nie znam Pythona, ale twoje pytanie wydaje się bardzo ogólne. Zignoruj mnie, jeśli jest specyficzny dla Pythona.
Zagnieżdżanie klas dotyczy zakresu. Jeśli uważasz, że jedna klasa będzie miała sens tylko w kontekście innej, to ta pierwsza jest prawdopodobnie dobrym kandydatem na klasę zagnieżdżoną.
Jest to powszechny wzorzec tworzenia klas pomocniczych jako prywatnych, zagnieżdżonych klas.
źródło
private
klas nie ma tak dużego zastosowania w Pythonie, ale domniemany zakres użycia nadal ma zastosowanie.Istnieje inne zastosowanie klasy zagnieżdżonej, gdy chce się skonstruować klasy dziedziczone, których rozszerzone funkcje są zawarte w określonej klasie zagnieżdżonej.
Zobacz ten przykład:
Zauważ, że w konstruktorze programu
foo
, liniaself.a = self.bar()
skonstruuje a,foo.bar
gdy konstruowany obiekt jest w rzeczywistościfoo
obiektem, ifoo2.bar
obiektem, gdy konstruowany obiekt jest w rzeczywistościfoo2
obiektem.Gdyby zamiast tego klasa
bar
została zdefiniowana poza klasąfoo
, podobnie jak jej odziedziczona wersja (którą można by nazwaćbar2
na przykład), to zdefiniowanie nowej klasyfoo2
byłoby znacznie bardziej bolesne, ponieważ konstruktor klasy musiałbyfoo2
mieć pierwszą linię zastąpioną przezself.a = bar2()
, co oznacza ponowne napisanie całego konstruktora.źródło
Naprawdę nie ma z tego żadnych korzyści, chyba że masz do czynienia z metaklasami.
klasa: zestaw naprawdę nie jest tym, za co myślisz. To dziwny zakres i robi dziwne rzeczy. To naprawdę nie daje klasy! To po prostu sposób na zebranie pewnych zmiennych - nazwy klasy, baz, małego słownika atrybutów i metaklasy.
Nazwa, słownik i bazy są przekazywane do funkcji, która jest metaklasą, a następnie przypisywane do zmiennej „nazwa” w zakresie, w którym znajdowała się klasa: zestaw.
To, co można uzyskać, mieszając metaklasy, a nawet zagnieżdżając klasy w klasach standardowych, jest trudniejsze do odczytania, trudniejsze do zrozumienia kodu i dziwnych błędów, które są strasznie trudne do zrozumienia bez dokładnego zrozumienia, dlaczego `` klasa '' zakres jest zupełnie inny niż każdy inny zakres Pythona.
źródło
except myInstanceObj.CustomError, e:
Możesz używać klasy jako generatora klas. Jak (w niektórych kodach poza mankietem :)
Czuję, że kiedy będziesz potrzebować tej funkcjonalności, będzie to dla Ciebie bardzo jasne. Jeśli nie musisz robić czegoś podobnego, prawdopodobnie nie jest to dobry przypadek użycia.
źródło
Nie, kompozycja nie oznacza zagnieżdżania. Zagnieżdżona klasa miałaby sens, jeśli chcesz ją bardziej ukryć w przestrzeni nazw klasy zewnętrznej.
W każdym razie nie widzę praktycznego zastosowania do zagnieżdżania w twoim przypadku. Uczyniłoby to kod trudniejszym do odczytania (zrozumienia), a także zwiększyłoby wcięcie, co spowodowałoby, że wiersze byłyby krótsze i bardziej podatne na pękanie.
źródło