Estoy tratando de hacer referencia a una clase interna de otra clase interna. He probado ambos:
class Foo(object): class A(object): pass class B(object): other = Ay
class Foo(object): class A(object): pass class B(object): other = Foo.Acon sus respectivos resultados:
Traceback (most recent call last): File "python", line 1, in <module> File "python", line 6, in Foo File "python", line 7, in B NameError: name 'A' is not definedy
Traceback (most recent call last): File "python", line 1, in <module> File "python", line 6, in Foo File "python", line 7, in B NameError: name 'Foo' is not definedes posible?
Esto no es posible, ya que todo lo que defina en una clase se convierte en un miembro válido solo en una instancia de esa clase, a menos que defina un método con @staticmethod , pero no existe tal propiedad para una clase.
Entonces, esto tampoco funcionará:
class Foo(object): x = 10 class A(object): pass class B(object): other = xEsto funcionará, pero no es lo que pretendías:
class Foo(object): x = 10 class A(object): pass class B(object): def __init__(self): self.other = Foo.A f = Foo() print(fB().other)La salida es:
<class '__main__.Foo.A'> La razón por la que esto funciona es que los métodos (en este caso, __init__ ) se evalúan cuando se crea el objeto, mientras que la asignación antes de __init__ se evalúa mientras se lee e interpreta la clase.
Puede obtener lo mismo que desea simplemente definiendo todas las clases dentro de un módulo propio. Al importar el módulo, lo convierte en un objeto cuyos campos son las clases que definas en él.
No creo que sea una buena práctica orientada a objetos, pero puede establecer atributos de clase interna en el ámbito de la clase externa. Por ejemplo.
class Class2: class Labels: c2l1 = 'label 1' c2l2 = 'label 2' class Params: pass # p1 = None # p2 = None # p3 = None Params.p1 = Labels.c2l2 Params.p2 = 1234 print(Class2.Params.p1) print(Class2.Params.p2) # print(Class2.Params.p3) label 2 1234Todos estos son atributos de clase, pero los atributos de instancia deberían funcionar de manera similar.