Est-il avantageux pour la définition d'une classe à l'intérieur d'une autre classe en Python?
Ce dont je parle ici sont des classes imbriquées. En gros, j'ai deux classes que je suis de modélisation. Un DownloadManager classe et un DownloadThread classe. L'évidence de la programmation orientée objet concept ici est la composition. Cependant, la composition n'est pas nécessairement la nidification, à droite?
J'ai un code qui ressemble à quelque chose comme 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 si il y a une situation où la nidification serait mieux. 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())
Vous devez vous connecter pour publier un commentaire.
Vous pouvez effectuer cette opération lorsque le "intérieure" de la classe est un one-off, qui ne seront jamais utilisés à l'extérieur de la définition de l'extérieur de la classe. Par exemple, pour utiliser une métaclasse, il est parfois utile
au lieu de définir une métaclasse séparément, si vous n'utilisez qu'une seule fois.
La seule autre fois, j'ai utilisé classes imbriquées comme ça, j'ai utilisé l'extérieur de la classe seulement comme un espace de noms de groupe de des tas de la proximité des classes d'ensemble:
Puis à partir d'un autre module, vous pouvez importer de Groupe et se réfèrent à eux comme Groupe.lc1, Groupe.cls2 etc. Cependant, on pourrait faire valoir que vous pouvez accomplir exactement la même (peut-être de moins en moins la confusion) à l'aide d'un module.
Je ne connais pas Python, mais votre question me semble très général. M'ignorer si c'est spécifique à Python.
Classe de nidification est tout au sujet de la portée. Si vous pensez qu'une classe n'a de sens que dans le contexte d'un autre, le premier est probablement un bon candidat pour devenir une classe imbriquée.
Il est commun de faire des classes d'assistance privés, classes imbriquées.
private
classes ne s'applique pas tellement en Python, mais l'implicite de l'utilisation de la portée encore certainement s'applique.Il n'y a vraiment aucun avantage à le faire, sauf si vous travaillez avec des metaclasses.
la classe: la suite n'est pas vraiment ce que vous pensez qu'elle est. Il est bizarre portée, et il fait des choses étranges. Il vraiment n'a même pas de classe! C'est juste une façon de la collecte de 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, et puis il est affecté à la variable " nom " dans le champ d'application où la classe: suite a été.
Ce que vous pouvez gagner à jouer avec metaclasses, et en effet par l'imbrication des classes au sein de votre stock de classes standard, est plus difficile à lire le code, plus difficile à comprendre le code, et des erreurs bizarres qui sont terriblement difficiles à comprendre sans être intimement familier avec pourquoi la "classe" champ d'application est entièrement différente de toute autre python portée.
except myInstanceObj.CustomError, e:
Vous pourriez être en utilisant une classe en tant que générateur de classe. Comme (dans certains improvisé code 🙂
Je me sens comme quand vous avez besoin de cette fonctionnalité, il sera très clair pour vous. Si vous n'avez pas besoin de faire quelque chose de semblable qu'il n'est probablement pas un bon cas d'utilisation.
Il y a une autre utilisation pour la classe imbriquée, quand on veut construire les classes héritées dont les fonctionnalités améliorées sont encapsulées dans une classe imbriquée.
Voir cet exemple:
Noter que dans le constructeur de
foo
, la ligneself.a = self.bar()
permettra de construire 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
a été définie en dehors de la classefoo
au lieu de cela, ainsi que sa version héritée (ce qui serait appelébar2
par exemple), puis de définir la nouvelle classefoo2
serait beaucoup plus douloureux, parce que la constuctor defoo2
aurait besoin d'avoir sa première ligne, remplacée parself.a = bar2()
, ce qui implique de ré-écrire l'ensemble du constructeur.Non, composition, ne signifie pas que la nidification.
Il serait logique d'avoir une classe imbriquée si vous voulez le cacher plus dans l'espace de noms de l'extérieur de la classe.
De toute façon, je ne vois aucune utilité pratique pour la nidification dans votre cas. Il serait de rendre le code plus difficile à lire (comprendre) et il serait également augmenter l'indentation qui permettrait de rendre les lignes plus courtes et plus enclin à se fendre.