108 votes

Pourquoi est-ce que je reçois AttributeError : Object has no attribute ?

J'ai une classe MyThread. Dans celle-ci, j'ai un exemple de méthode. J'essaie de l'exécuter dans le même contexte d'objet. Jetez un coup d'œil au code :

class myThread (threading.Thread):
    def __init__(self, threadID, name, counter, redisOpsObj):
        threading.Thread.__init__(self)
        self.threadID = threadID
        self.name = name
        self.counter = counter
        self.redisOpsObj = redisOpsObj

    def stop(self):
        self.kill_received = True

    def sample(self):
        print "Hello"

    def run(self):
        time.sleep(0.1)
        print "\n Starting " + self.name
        self.sample()

Ça a l'air très simple, n'est-ce pas ? Mais quand je l'exécute, j'obtiens cette erreur

AttributeError: 'myThread' object has no attribute 'sample' Maintenant, j'ai cette méthode, juste là. Alors, quel est le problème ? Aidez-moi, s'il vous plaît.

Edit : Voici la trace de la pile

Starting Thread-0

Starting Thread-1
Exception in thread Thread-0:
Traceback (most recent call last):
File "/usr/lib/python2.6/threading.py", line 525, in __bootstrap_inner
self.run()
File "./redisQueueProcessor.py", line 51, in run
self.sample()
AttributeError: 'myThread' object has no attribute 'sample'

Exception in thread Thread-1:
Traceback (most recent call last):
File "/usr/lib/python2.6/threading.py", line 525, in __bootstrap_inner
self.run()
File "./redisQueueProcessor.py", line 51, in run
self.sample()
AttributeError: 'myThread' object has no attribute 'sample'

Je l'appelle comme ceci

arThreads = []
maxThreads = 2;

for i in range( maxThreads ):
    redisOpsObj = redisOps()
    arThreads.append( myThread(i, "Thread-"+str(i), 10, redisOpsObj) )

Désolé, je ne peux pas poster le code de la classe redisOps. Mais je peux vous assurer qu'elle fonctionne très bien.

120voto

Ignacio Vazquez-Abrams Points 312628

Votre indentation est mal faite, et vous avez mélangé les tabulations et les espaces. Exécutez le script avec python -tt à vérifier.

38voto

Timothy Points 439

Si vous utilisez python 3+, cela peut également se produire si vous utilisez des variables privées qui commencent par un double soulignement, par exemple, self.__votrevariable. C'est juste quelque chose à noter pour ceux d'entre vous qui pourraient rencontrer ce problème.

17voto

Trevor Points 401

Ce genre de bogues est fréquent lorsque Python est multithreading. Ce qui se passe, c'est que, lors de l'arrêt de l'interpréteur, le module concerné ( myThread dans ce cas) passe par une sorte de del myThread .

L'appel self.sample() est à peu près équivalent à myThread.__dict__["sample"](self) . Mais si nous nous trouvons pendant la séquence de démontage de l'interpréteur, alors son propre dictionnaire de types connus pourrait déjà avoir myThread supprimé, et maintenant c'est essentiellement un NoneType - et n'a pas d'attribut "sample".

11voto

mitendra Points 156

Cela peut également se produire si vous utilisez Machines à sous en classe et n'ont pas encore ajouté ce nouvel attribut dans les créneaux horaires.

class xyz(object):
"""
class description

"""

__slots__ = ['abc', 'ijk']

def __init__(self):
   self.abc = 1
   self.ijk = 2
   self.pqr = 6 # This will throw error 'AttributeError: <name_of_class_object> object has no attribute 'pqr'

2voto

ShitalShah Points 2213

J'ai obtenu cette erreur dans le cas d'un scénario de multithreading (en particulier lorsqu'on utilise ZMQ). Il s'est avéré que le socket était toujours connecté sur un thread alors qu'un autre thread avait déjà commencé à envoyer des données. Les événements qui se sont produits sont dus au fait qu'un autre thread a essayé d'accéder à des variables qui n'avaient pas encore été créées. Si votre scénario implique le multithreading et si les choses fonctionnent si vous ajoutez un peu de retard, alors vous pourriez avoir un problème similaire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X