Ce dont je parle ici, ce sont des classes imbriquées. Essentiellement, j'ai deux classes que je modélise. Une classe DownloadManager et une classe DownloadThread. Le concept évident de la POO ici est la composition. Cependant, composition ne signifie pas nécessairement nidification, non?
J'ai du code qui ressemble à ceci:
class DownloadThread:
def foo(self):
pass
class DownloadManager():
def __init__(self):
dwld_threads = []
def create_new_thread():
dwld_threads.append(DownloadThread())
Mais maintenant je me demande s'il y a une situation où la nidification serait meilleure. Quelque chose comme:
class DownloadManager():
class DownloadThread:
def foo(self):
pass
def __init__(self):
dwld_threads = []
def create_new_thread():
dwld_threads.append(DownloadManager.DownloadThread())
Je ne connais pas Python, mais votre question semble très générale. Ignorez-moi si c'est spécifique à Python.
L'imbrication de classes est une question de portée. Si vous pensez qu'une classe n'aura de sens que dans le contexte d'une autre, alors la première est probablement un bon candidat pour devenir une classe imbriquée.
C'est un modèle courant pour faire des classes d'assistance comme des classes privées et imbriquées.
la source
private
classes ne s'applique pas tellement en Python, mais une portée d'utilisation implicite s'applique toujours.Il existe une autre utilisation de la classe imbriquée, lorsque l'on veut construire des classes héritées dont les fonctionnalités améliorées sont encapsulées dans une classe imbriquée spécifique.
Voir cet exemple:
Notez que dans le constructeur de
foo
, la ligneself.a = self.bar()
construira unfoo.bar
lorsque l'objet en cours de construction est en fait unfoo
objet, et unfoo2.bar
objet lorsque l'objet en cours de construction est en fait unfoo2
objet.Si la classe
bar
était définie en dehors de la classe à lafoo
place, ainsi que sa version héritée (qui serait appeléebar2
par exemple), alors la définition de la nouvelle classefoo2
serait beaucoup plus pénible, car le constructeur defoo2
aurait besoin de remplacer sa première ligne parself.a = bar2()
, ce qui implique de réécrire tout le constructeur.la source
Il n'y a vraiment aucun avantage à faire cela, sauf si vous avez affaire à des métaclasses.
la classe: la suite n'est vraiment pas ce que vous pensez. C'est une lunette étrange et cela fait des choses étranges. Cela ne fait même pas un cours! C'est juste un moyen de collecter certaines variables - le nom de la classe, les bases, un petit dictionnaire d'attributs et une métaclasse.
Le nom, le dictionnaire et les bases sont tous passés à la fonction qui est la métaclasse, puis il est affecté à la variable «nom» dans la portée où se trouvait la classe: suite.
Ce que vous pouvez gagner en jouant avec les métaclasses, et en imbriquant des classes dans vos classes standard de stock, est plus difficile à lire le code, plus difficile à comprendre le code et des erreurs étranges qui sont terriblement difficiles à comprendre sans être intimement familier avec pourquoi la `` classe '' scope est entièrement différente de toute autre portée python.
la source
except myInstanceObj.CustomError, e:
Vous pourriez utiliser une classe comme générateur de classe. Comme (dans certains codes off the cuff :)
J'ai l'impression que lorsque vous aurez besoin de cette fonctionnalité, ce sera très clair pour vous. Si vous n'avez pas besoin de faire quelque chose de similaire, ce n'est probablement pas un bon cas d'utilisation.
la source
Non, la composition ne veut pas dire nidification. Il serait judicieux d'avoir une classe imbriquée si vous souhaitez la masquer davantage dans l'espace de noms de la classe externe.
Quoi qu'il en soit, je ne vois aucune utilité pratique pour l'imbrication dans votre cas. Cela rendrait le code plus difficile à lire (à comprendre) et cela augmenterait également l'indentation, ce qui rendrait les lignes plus courtes et plus sujettes à la division.
la source