AttributeErrorが発生するのはなぜですか:オブジェクトに属性がありません[クローズ]


82

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クラスコードを投稿できません。しかし、私はそれがうまく機能することをあなたに保証することができます


コールスタックで完全なエラーを投稿しますか?
ナマケモノ2012

あなたが呼んでいる方法でコードを追加していただけませんか?
バブ2012

2
不足しているコードはありますか?このスニペットは私にとってはうまく機能します。
ThirdOne 2012

2
大変申し訳ございません。はい、私のインデントはだまされました。Pythonの完全な初心者。したがって、インデントの重要性を見逃している可能性があります。
Shades88 2012

Pythonのコーディング中は、コードエディタで[タブとスペースを表示]を選択する必要があります
vanduc1102 2016年

回答:


94

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


そのアイオープナーをありがとう。今それを手に入れました。愚かな質問とそのような質問の説明が長すぎて申し訳ありません;)
Shades88 2012

3
「python-ttでスクリプトを実行して確認する」の意味を教えてください。
akshay_rahar 2016

9
@akshay_rahar:python -tt script.py
Ignacio Vazquez-Abrams

1
では、この魔法のパラメータ-ttは何をするのでしょうか?私はそれを発見していないドキュメント
ルカシュNojek

10
更新:-ttフラグはPython 3には存在せず、Python 2に存在していました。
ŁukaszNojek19年

13

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


PIPに文書化されていますか?
ダッシュ

1
問題にぶつかってこのコメントを見つけたのに、なぜ彼らはそれをそのように設計するのでしょうか?
matthewhang

1
ここに文書化されています:docs.python.org/3/tutorial/classes.html#private-variables
Mohit

12

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

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


7

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

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'

2

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


1

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


0

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


再起動するコマンドなどを投稿できます。初心者にも役立つかもしれません。
カーン

0

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


-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はプライベートメソッドです。


3
作成者はプライベートメソッドにアクセスしようとはしていません。質問も6年以上前のものであり、すでに解決されているため、もう一度回答する必要はありません。
ヨハン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.