2010-11-13 6 views
1

Je ne savais vraiment pas quel titre je devais choisir. Quoi qu'il en soit, j'ai le code comme celui-ci (ce qui est fixtures):Accéder à une classe enfant d'une autre classe enfant dans la classe parent

from fixture import DataSet 

class CategoryData(DataSet): 
    class cat1: 
     name = 'Category 1' 
    class cat2: 
     name = 'Category 2' 
     parent = cat1 

Le problème est que je ne peux pas faire référence à cat1 dans cat2 comme ça:

File "/home/julas/cgp/cgp/datasets/__init__.py", line 11, in cat2 
    parent = cat1 
NameError: name 'cat1' is not defined 

Comment puis-je faire?

Répondre

3

Il y a deux problèmes ici. D'abord, Python n'effectue pas de portée imbriquée comme celle-ci pour vous. Pour accéder à CategoryData.cat1, vous devez l'épeler. Deuxièmement, et un plus gros problème, est qu'il n'y a aucun moyen d'accéder CategoryData à partir de là: la classe n'a pas encore été définie, puisque vous êtes en train de le définir. Si vous faites ceci:

class Object(object): 
    a = 1 
    b = Object.a 

il échouera, car la valeur de Object n'est pas affecté jusqu'à la fin de la définition de classe. Vous pouvez penser que se passe comme ceci:

class _unnamed_class(object): 
    a = 1 
    b = Object.a 
Object = _unnamed_class 

Il n'y a pas moyen de référencer a d'où b est affecté, parce que la classe contenant n'a pas encore été attribuée à son nom.

Pour affecter parent comme une propriété de classe, vous devez attribuer après la classe contenant existe réellement:

class CategoryData(DataSet): 
    class cat1: 
     name = 'Category 1' 
    class cat2: 
     name = 'Category 2' 
CategoryData.cat2.parent = CategoryData.cat1 
+0

J'utilise trop montage et alors que je ne l'ai pas rencontré ce problème je l'ai vu décrit . Je crois que la réponse de Glenn fera ce que vous voulez, mais vous aurez les définitions de vos appareils un peu dispersés et moins lisibles. Je serai curieux de voir ce que vous finirez par faire. – Marco

+0

Je savais que le problème était dans la définition n'étant pas fini quand j'ai essayé de référencer la classe. Je n'ai juste pas pensé à le sortir de la définition. Je suppose que je vais l'utiliser car je ne vois pas d'autres options. Je ne sais pas si un autre format, comme YAML ne serait pas mieux pour les fixtures au lieu de plier Python comme ça. –

1

Soit vous: déplacer hors de la définition:

CategoryData.cat2.parent=CategoryData.cat1 

Ou, si elle est un attribut d'objet (et non un attribut class):

class cat2: 
    name = 'Category 2' 
    def __init__(self): 
     self.parent = cat1 
Questions connexes