131 votes

Est-il avantageux de définir une classe dans une autre classe en Python?

Donc, ce dont je parle ici, ce sont des classes imbriquées. Donc, essentiellement, j'ai deux classes que je modélise. J'ai une classe DownloadManager et une classe DownloadThread. Le concept évident de POO ici est la composition. Cependant, composition ne signifie pas nécessairement nidification, non?

Donc, j'ai un code qui ressemble à quelque chose comme ça:

 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 existe une situation où la nidification serait préférable. 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())
 

153voto

dF. Points 29787

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

class Foo(object):
    class __metaclass__(type):
        ....

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 de:

class Group(object):
    class cls1(object):
       ...

    class cls2(object):
       ...

Ensuite, à 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.

27voto

André Neves Points 3080

Je ne connais pas Python, mais votre question semble très générale. Ignore-moi si c'est spécifique à Python.

L'imbrication de classe est une question de portée. Si vous pensez qu'une classe n'a de sens que dans le contexte d'une autre, la première est probablement un bon candidat pour devenir une classe imbriquée.

C'est un modèle courant qui fait des classes auxiliaires des classes privées et imbriquées.

6voto

tim.tadh Points 564

Vous pourriez utiliser une classe en tant que générateur de classe. J'aime (dans certains codes du poignet :)

 class gen(object):
    class base_1(object): pass
    ...
    class base_n(object): pass

    def __init__(self, ...):
        ...
    def mk_cls(self, ..., type):
        '''makes a class based on the type passed in, the current state of
           the class, and the other inputs to the method'''
 

Je pense 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.

5voto

Jerub Points 17488

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.

1voto

Cristian Ciupitu Points 5692

Non, composition ne signifie pas nidification. Il serait judicieux d’avoir une classe imbriquée si vous voulez la cacher davantage dans l’espace de noms de la classe externe.

Quoi qu'il en soit, je ne vois aucune utilisation pratique de la nidification dans votre cas. Cela rendrait le code plus difficile à lire (à comprendre) et augmenterait également l'indentation, ce qui rendrait les lignes plus courtes et plus sujettes à la scission.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X