[Python] كيفية فرض حذف كائن الثعبان؟


Answers

بشكل عام، للتأكد من حدوث شيء مهما كانت، يمكنك استخدام

from exceptions import NameError

try:
    f = open(x)
except ErrorType as e:
    pass # handle the error
finally:
    try:
        f.close()
    except NameError: pass

finally سيتم تشغيل كتل ما إذا كان هناك خطأ في كتلة try ، وما إذا كان هناك خطأ في أي معالجة الخطأ الذي يحدث في except كتل. إذا كنت لا تتعامل مع استثناء التي يتم رفعها، فإنه سوف لا تزال تثار بعد أن يتم إكسكوتد كتلة finally .

الطريقة العامة للتأكد من إغلاق ملف هو استخدام "مدير السياق".

http://docs.python.org/reference/datamodel.html#context-managers

with open(x) as f:
    # do stuff

وهذا تلقائيا إغلاق f .

لسؤالك رقم 2، يتم إغلاق bar على الفور عندما يكون عدد مرجع يصل إلى الصفر، وذلك على del foo إذا لم تكن هناك مراجع أخرى.

لا يتم إنشاء الكائنات بواسطة __init__ ، يتم إنشاؤها بواسطة __new__ .

http://docs.python.org/reference/datamodel.html#object. الجديد

عند القيام foo = Foo() يحدث أمران في الواقع، أولا يتم إنشاء كائن جديد، __new__ ، ثم يتم تهيئة، __init__ . لذلك ليس هناك طريقة يمكن أن ندعو del foo قبل كل من تلك الخطوات قد وقعت. ومع ذلك، إذا كان هناك خطأ في __init__ ، __del__ لأنه تم بالفعل إنشاء __new__ في __new__ .

تحرير: تصحيح عند حدوث الحذف إذا انخفض عدد مرجع إلى الصفر.

Question

أنا غريبة عن تفاصيل __del__ في الثعبان، متى ولماذا يجب أن تستخدم وما لا ينبغي أن تستخدم ل. لقد تعلمت بالطريقة الصعبة أنه ليس حقا مثل ما يتوقعه المرء بسذاجة من المدمر، في أنه ليس العكس من __new__ / __init__ .

class Foo(object):

    def __init__(self):
        self.bar = None

    def open(self):
        if self.bar != 'open':
            print 'opening the bar'
            self.bar = 'open'

    def close(self):
        if self.bar != 'closed':
            print 'closing the bar'
            self.bar = 'close'

    def __del__(self):
        self.close()

if __name__ == '__main__':
    foo = Foo()
    foo.open()
    del foo
    import gc
    gc.collect()

رأيت في الوثائق أنه غير مضمون __del__() يتم استدعاء أساليب الكائنات التي لا تزال موجودة عند الخروج من مترجم.

  1. كيف يمكن ضمان أن أي حالات Foo الموجودة عند الخروج من مترجم، يتم إغلاق شريط؟
  2. في مقتطف الشفرة أعلاه يتم إغلاق الشريط في del foo أو على gc.collect() ... أم لا؟ إذا كنت تريد مراقبة أدق من تلك التفاصيل (على سبيل المثال يجب إغلاق شريط عندما يكون الكائن غير مرجعية) ما هي الطريقة المعتادة لتنفيذ ذلك؟
  3. عندما يتم استدعاء __del__ هو أنه مضمون أن __init__ قد دعا بالفعل؟ ماذا عن إذا أثار __init__ ؟



  1. إضافة معالج الخروج الذي يغلق جميع الأشرطة.
  2. __del__() عندما يصل عدد المراجع إلى كائن 0 أثناء تشغيل فم. قد يكون سبب ذلك من قبل غ.
  3. إذا كان __init__() يثير استثناء ثم يفترض أن يكون غير مكتمل و __del__() لن يتم الاحتجاج بها.