2012-07-27 30 views
31

私はクラスMyThreadを持っています。その中に私は方法のサンプルがあります。私は同じオブジェクトコンテキストを使用してそれを実行しようとしています。コードをご覧ください:Python AttributeError:オブジェクトには属性がありません

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() 

非常にシンプルではありません。しかし、私がそれを実行すると、私はこのエラーが発生します

AttributeError: 'myThread' object has no attribute 'sample'今私はその方法があります。だから何が問題なの?

編集を助けてください:これは私がredisOpsクラスコードを投稿することはできません申し訳ありませんが、この

arThreads = [] 
maxThreads = 2; 

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

のようにそれを呼び出していますスタックトレース

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' 

です。しかし、私はそれがうまく動作することを保証することができます

+0

コールスタックで完全なエラーを投稿しますか? – sloth

+0

あなたはどのように呼び出しているかのコードを追加できますか? – Babu

+2

コードがありませんか?このスニペットは私のためにfienの作品です。 – ThirdOne

答えて

59

あなたのインデントは失敗し、タブとスペースを混在させました。検証するためにpython -ttでスクリプトを実行します。

+0

そのアイオープナーに感謝します。今すぐ入手してください。愚かな質問とそのような質問の長すぎる説明に申し訳ありません;) – Shades88

+10

うわー私は '-tt'を知らなかった – n611x007

+0

これらの種類のバグは、Pythonのマルチスレッド時に一般的です。何が起こるのかは、インタプリタを解体すると、関連するモジュール(この場合はmyThread)がある種の「del myThread」を通過するということです。 – Trevor

5

これらの種類のバグは、Pythonのマルチスレッド時によく発生します。何が起こるかは、通訳者の解任時に、関連するモジュール(この場合はmyThread)が一種のdel myThreadを通過することです。

self.sample()は、myThread.__dict__["sample"](self)とおおよそ同等です。 しかし、インタプリタの解凍シーケンス中に既知の型の辞書に既にmyThreadが削除されている可能性があります。現在は基本的にはNoneTypeですが、 'sample'属性はありません。

0

Pythonは、クラス名を含むように内部的に名前を変更することによってそれらのメンバーを保護します。 object._className__attrNameなどの属性にアクセスできます。

関連する問題