2010-12-08 4 views
0

J'ai 2 classes:Quelle pourrait être la raison pour laquelle une classe ne peut pas être accédée depuis la fonction d'une autre classe?

import follow 
class User(object): 
    def __init__(self): 
     pass 

import user 
class Follow(object): 
    def doSomething(self): 
     u = User() 

>> f = Follow() 
>> f.doSomething() 
>> NameError: global name 'User' is not defined 

Est-ce que cela pose un problème parce que les deux classes importent les uns des autres? Y a-t-il l'équivalent d'une importation une fois? D'autres causes potentielles? Merci.

+2

Vous ne pouvez pas importer de classes. Vous importez des modules. Et vos modules ne peuvent pas avoir de dépendances circulaires. Corrigez votre code en fonction de cette information. – pyfunc

+0

Cette copie de code est-elle collée exactement? Cela devrait compiler, mais sans savoir ce que sont les modules de suivi et d'utilisateur, nous n'avons aucune idée. – Falmarri

Répondre

3

u = user.User() 

ou bien:


from user import User 
u = User() 
+0

Notez également le problème d'importation circulaire. – detly

1

user.py

class User(object): 
    def __init__(self): 
     pass 

follow.py

from user import User 

class Follow(object): 
    def doSomething(self): 
     u = User() 
1

Le problème semble être que vous importez user puis en accédant User. Utilisez user.User ou (pas aussi gentil) from user import User.

Python traite les modules comme des espaces de noms et tout ce qui est défini dans la portée globale d'un module est uniquement disponible en tant qu'attribut du module dans d'autres espaces de noms qui l'importent. Il n'y a pas de véritable 'portée globale' dans Python comme il y en a dans d'autres langues.

La syntaxe from foo import bar permet d'apporter un identifiant directement dans tout champ il est exécuté mais tente ensuite de recharger le module mettra plus à jour cette référence. Il y a aussi le problème du suivi de l'origine des identifiants. En outre, vous ne semblez pas réellement utiliser follow dans le module user. Cela ne devrait pas poser de problème, mais si vous l'utilisez réellement, vous devriez probablement étendre votre exemple pour inclure l'utilisation. Comment les modules s'importent les uns les autres peuvent déterminer si cela est réellement autorisé ou non.

0

Vous pouvez essayer d'utiliser soit

from user import * 

(qui est généralement pas recommandé)

ou créer des objets User utilisant le nom qualifié:

... 
u = user.User() 

correcte importation

from user import User 

ne fonctionne pas dans votre cas, je suppose, à cause des importations récursives.

+0

Quand je u = user.User() j'obtiens: UnboundLocalError: variable locale 'user' référencée avant l'affectation – ensnare

+0

@ensnare, cela signifie très probablement que vous avez une variable nommée 'user' plus tard dans la fonction qui augmente cette erreur. – aaronasterling

0

Il y aura toujours un problème, peu importe. Si c'est une question théorique alors bien. Mais si c'est une conception réelle, arrêtez-vous. Le suivant est une action. Cela devrait être une fonction dans la classe Utilisateur de faire n'importe quel sens.

class User(object): 
    def __init__(self): 
      print "bleh" 
    def follow(self,otheruser) 
      following.append(otheruser) 

cela a beaucoup plus de sens. ce qui suit est évidemment une liste tirée de quelque part soit une variable ou directement à partir de la base de données.

Questions connexes