De lo que estoy hablando aquí son clases anidadas. Esencialmente, tengo dos clases que estoy modelando. Una clase DownloadManager y una clase DownloadThread. El concepto obvio de OOP aquí es la composición. Sin embargo, la composición no significa necesariamente anidar, ¿verdad?
Tengo un código que se parece a esto:
class DownloadThread:
def foo(self):
pass
class DownloadManager():
def __init__(self):
dwld_threads = []
def create_new_thread():
dwld_threads.append(DownloadThread())
Pero ahora me pregunto si existe una situación en la que anidar sería mejor. Algo como:
class DownloadManager():
class DownloadThread:
def foo(self):
pass
def __init__(self):
dwld_threads = []
def create_new_thread():
dwld_threads.append(DownloadManager.DownloadThread())
No conozco Python, pero tu pregunta parece muy general. Ignórame si es específico de Python.
El anidamiento de clases tiene que ver con el alcance. Si cree que una clase solo tendrá sentido en el contexto de otra, entonces la primera probablemente sea una buena candidata para convertirse en una clase anidada.
Es un patrón común hacer clases auxiliares como clases privadas anidadas.
fuente
private
clases no se aplica tanto en Python, pero definitivamente se aplica un ámbito de uso implícito.Existe otro uso para la clase anidada, cuando se quiere construir clases heredadas cuyas funcionalidades mejoradas están encapsuladas en una clase anidada específica.
Vea este ejemplo:
Tenga en cuenta que en el constructor de
foo
, la líneaself.a = self.bar()
construirá afoo.bar
cuando el objeto que se está construyendo es en realidad unfoo
objeto, y unfoo2.bar
objeto cuando el objeto que se está construyendo es en realidad unfoo2
objeto.Si la clase
bar
se definió fuera de la clase en sufoo
lugar, así como su versión heredada (que se llamaríabar2
por ejemplo), entonces definir la nueva clasefoo2
sería mucho más doloroso, porque el constructor defoo2
necesitaría tener su primera línea reemplazada porself.a = bar2()
, lo que implica reescribir todo el constructor.fuente
Realmente no hay ningún beneficio en hacer esto, excepto si se trata de metaclases.
la clase: suite realmente no es lo que crees que es. Es un alcance extraño y hace cosas extrañas. ¡Realmente ni siquiera hace una clase! Es solo una forma de recopilar algunas variables: el nombre de la clase, las bases, un pequeño diccionario de atributos y una metaclase.
El nombre, el diccionario y las bases se pasan a la función que es la metaclase, y luego se asigna a la variable 'nombre' en el ámbito donde estaba la clase: suite.
Lo que puede ganar jugando con metaclases, y de hecho anidando clases dentro de sus clases estándar de valores, es más difícil de leer el código, más difícil de entender el código y errores extraños que son terriblemente difíciles de entender sin estar íntimamente familiarizado con el por qué de la 'clase' El alcance es completamente diferente a cualquier otro alcance de Python.
fuente
except myInstanceObj.CustomError, e:
Podrías estar usando una clase como generador de clases. Como (en algunos códigos improvisados :)
Siento que cuando necesites esta funcionalidad te quedará muy claro. Si no necesita hacer algo similar, probablemente no sea un buen caso de uso.
fuente
No, la composición no significa anidar. Tendría sentido tener una clase anidada si desea ocultarla más en el espacio de nombres de la clase externa.
De todos modos, no veo ningún uso práctico para anidar en su caso. Haría que el código fuera más difícil de leer (entender) y también aumentaría la sangría, lo que haría que las líneas fueran más cortas y más propensas a dividirse.
fuente