6

I'm using an object's __del__() to unsubscribe it from an event (using an event scheme similar to this):

import my_enviroment
class MyClass():
    def __del__(self):
        my_environment.events.my_event -= self.event_handler_func

Oddly I received the following error at the end of the program's run:

Exception AttributeError: "'NoneType' object has no attribute 'events'" in <bound method MyClass.__del__ of <myclass.MyClass instance at 0x04C54580>> ignored

How could this be possible?! my_environment is a module I imported, how come it could be None? (events is a global object in it with event hooks such as my_event)

4

2 に答える 2

7

についてのpythonドキュメント__del__によると:

[...]__del__()メソッドによって参照される他のグローバルは、既に削除されているか、取り壊されている可能性があります (例: インポート機械のシャットダウン)。このため、__del__()メソッドは、外部不変条件を維持するために必要な絶対最小限のことを行う必要があります。

つまり、__del__メソッドがオブジェクトで呼び出されると、my_enviromentPython によって「削除」された可能性があるため、None になる可能性があります...

于 2011-12-21T13:10:01.837 に答える
4

Python のドキュメントを確認すると、オブジェクトが終了した時点で、プログラムの最後で「機械」が既に分解されていることがわかります。つまり、依存していたものの多くが既になくなっているということです。この場合は、モジュール参照を持つグローバル変数です。

あなたがしなければならないことは、プログラムが終了する前に呼び出す必要のあるオブジェクトが確実に破棄__del__されるようにすることです. または、句をブロック内にラップして、例外が発生しないようにします-プログラムの終了時にそこにあるコードの実行が重要でない場合。__enter____exit__with__del__try-except

于 2011-12-21T13:13:34.607 に答える