97

MyThreadクラスがあります。その中に、メソッドサンプルがあります。同じオブジェクトコンテキスト内から実行しようとしています。コードを見てください:

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'今、私はその方法を持っています。では、何が問題なのですか?助けてください

編集:これはスタックトレースです

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'

私はそれをこのように呼んでいます

arThreads = []
maxThreads = 2;

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

申し訳ありませんが、redisOpsクラスコードを投稿できません。しかし、私はそれがうまく機能することをあなたに保証することができます

4

9 に答える 9

106

インデントが間抜けで、タブとスペースが混在しています。でスクリプトを実行しpython -ttて確認します。

于 2012-07-27T10:41:22.057 に答える
24

python 3+を使用している場合、これは、二重アンダースコアで始まるプライベート変数を使用している場合にも発生する可能性があります(例:self .__ yourvariable)。この問題に遭遇する可能性のある一部の人のために注意すべき点があります。

于 2018-08-03T15:03:21.007 に答える
15

この種のバグは、Pythonマルチスレッドの場合によく見られます。何が起こるかというと、インタプリタの分解時に、関連するモジュール(myThreadこの場合)は一種のを通過しますdel myThread

この呼び出しself.sample()は、おおよそ。と同等myThread.__dict__["sample"](self)です。しかし、インタプリタの分解シーケンス中にいる場合は、既知のタイプの独自の辞書がすでにmyThread削除されている可能性があり、現在は基本的にNoneType-であり、「サンプル」属性はありません。

于 2015-07-29T13:12:35.743 に答える
9

これは、クラスでスロットを使用していて、この新しい属性をまだスロットに追加していない場合にも発生する可能性があります。

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'
于 2019-05-19T17:08:21.337 に答える
2

マルチスレッドシナリオでこのエラーが発生しました(特にZMQを処理する場合)。別のスレッドがすでにデータの送信を開始している間、ソケットはまだ1つのスレッドに接続されていることが判明しました。別のスレッドが原因で発生したイベントは、まだ作成されていない変数にアクセスしようとしました。シナリオにマルチスレッドが含まれていて、少し遅延を追加しても問題が解決しない場合は、同様の問題が発生する可能性があります。

于 2018-12-20T03:15:41.217 に答える
1

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

于 2016-06-06T07:51:17.183 に答える
1

mythreadという名前の別の変数がある場合にも同じエラーが発生しました。その変数がこれを上書きし、それがエラーが発生した理由です

于 2019-04-16T02:02:01.080 に答える
0

私も同じエラーに遭遇しました。インデントに問題はなかったと思います。Pythonの販売を再開するだけで問題は解決しました。

于 2019-01-02T21:58:24.653 に答える
-3

クラスのプライベートフィールドの外部にアクセスすることはできません。プライベートフィールドは__で始まります。例えば ​​-

class car:
    def __init__(self):
        self.__updatesoftware()

    def drive(self):
        print("driving")

    def __updatesoftware(self):
        print("updating software:")

obj = car()
obj.drive()  
obj.__updatesoftware()  ## here it will throw an error because 

__updatesoftwareはプライベートメソッドです。

于 2018-09-25T15:28:09.317 に答える