Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonオブジェクトを正しくクリーンアップするにはどうすればよいですか?


グローバルを[なし]に設定すると、グローバルがクリーンアップされます。地元の人々は、セッションの終わりに自己破壊します。 Pythonによって呼び出される関数__del__は、グローバルをNoneに設定します。

指定されたクラスのすべてのオブジェクトがクリーンアップされる次のコードを検討してください-

class Counter:
    Count = 0   # This is the count of objects of this class
    def __init__(self, name):
        self.name = name
        print name, 'created'
        Counter.Count += 1
    def __del__(self):
        print self.name, 'deleted'
        Counter.Count -= 1
        if Counter.Count == 0:
            print 'Last Counter object deleted'
        else:
            print Counter.Count, 'Counter objects remaining'
x = Counter("First")
del x

最後のデルがないと、例外が発生します。

__del__に関するPythonドキュメントから-

警告:__ del __()メソッドが呼び出される不安定な状況のため、実行中に発生した例外は無視され、代わりに警告がsys.stderrに出力されます。また、モジュールの削除に応答して__del __()が呼び出された場合(たとえば、プログラムの実行が完了した場合)、__ del __()メソッドによって参照される他のグローバルはすでに削除されている可能性があります。このため、__ del __()メソッドは、外部不変条件を維持するために必要な最小限の処理を実行する必要があります。

delへの明示的な呼び出しがない場合、__ del__はプログラムの最後にのみ呼び出され、Counterおよび/またはCountは__del__が呼び出されるまでにすでにGCされている可能性があります(オブジェクトが収集される順序は決定論的ではありません)。例外は、Counterがすでに収集されていることを意味します。 __del__では特に凝ったことはできません。

ここには2つの可能な解決策があります。

  • ファイルオブジェクトにはclose()などの明示的なファイナライザーメソッドを使用します。

  • 弱参照を使用します。


  1. 辞書内でPython辞書を定義する方法は?

    ディクショナリオブジェクトは変更可能です。したがって、1つのディクショナリオブジェクトをキーの値コンポーネントとして使用できます。したがって、ネストされたディクショナリオブジェクトを作成できます。別のディクショナリオブジェクトは、キーに関連付けられた値として定義されます。 >>>> students={"student1":{"name":"Raaj", "age":23, "subjects":["Phy", "Che", &qu

  2. Python関数からjsonオブジェクトを返す方法は?

    指定されたPythonディクショナリを使用して、次のようにpython関数からjsonオブジェクトを返します。 例 import json a = {'name':'Sarah', 'age': 24, 'isEmployed': True } # a python dictionary def retjson(): python2json = json.dumps(a) print python2json retjson() 出力 {"age": 24, "isEmployed": tru