2010-10-07 4 views
2

En Python, pouvez-vous avoir des classes avec des membres qui sont eux-mêmes des pointeurs vers des membres du même type? Par exemple, en C, vous pourriez avoir la classe suivante pour un noeud dans un arbre binaire:Classes auto-référencées en python?

struct node { 
    int data; 
    struct node* left; 
    struct node* right; 
} 

Comment voulez-vous créer en python ce qui revient?

+2

Ce sont des pointeurs vers la classe, pas la même classe. Vous ne pouvez pas avoir de classe avec des membres de son propre type dans aucune langue. C'est une récursion infinie. – JoshD

+0

Vous avez raison. Mes excuses. La question est toujours pertinente, cependant. – amssage

+0

Ce n'est pas vrai, regardez un exemple de liste chaînée simple en Java: http://stackoverflow.com/questions/354875/reversing-a-linked-list-in-java-recursively – ridecar2

Répondre

7

Python est un langage dynamique. Les attributs peuvent être liés à (presque) n'importe quel moment avec n'importe quel type. Par conséquent, le problème que vous décrivez n'existe pas en Python.

+0

Hein? Cela n'a pas répondu à la question de l'OP "" "Comment créeriez-vous cela de manière équivalente en python?" " –

+0

@John Machin: Evidemment le PO pensait que c'était le cas, car il avait accepté la réponse.:) –

+0

@John: Bien qu'il ait écrit "Comment créeriez-vous de manière équivalente ceci en python?", Ce qu'il demandait réellement était "Comment déclarez-vous les membres qui ont le type de la classe actuelle?". La réponse, bien sûr, est que vous n'avez pas, puisque vous n'avez pas besoin de Python. –

8

Emulation d'un struct C dans le python (en utilisant str au lieu d'int comme type de données):

"déclaration":

class Node(object): 
    data = None # str 
    left = None # Node object or None 
    right = None # Node object or None 

Utilisation:

root = Node() 
root.data = "foo" 

b = Node() 
b.data = "bar" 
root.left = b 

z = Node() 
z.data = "zot" 
root.right = z 
+4

Vous déclarez des membres de la classe ici, pas des membres de l'instance, n'est-ce pas? –

+0

Désolé, quelqu'un peut-il expliquer le commentaire ci-dessus? – amssage

+0

@amssage: Vous pouvez consulter les réponses à [cette autre question] (http://stackoverflow.com/questions/2424451/about-python-class-and-instance-variables) et/ou lire la page de le [tutoriel Python sur les classes] (http://docs.python.org/tutorial/classes.html). –

2

Comment est-ce que je créer de manière équivalente ceci en python?

class node(object): 
    def __init__(self, data, left, right): 
     self.data = data 
     self.left = left 
     self.right = right 

Comme toutes les variables Python sont, en effet, les références sans type, vous n'avez pas parler de l'avant que gauche et à droite vont être les instances de nœuds.

2

Vous ne pouvez pas déclarer des types en Python - par conséquent, il n'y a aucun problème à déclarer des types en Python.