Python

2009-06-03 11 views
5

'da modülün silinmesini gerektiren yöntem Sınıfımı yok ederken çağrılacak olan modülüme ekleyebileceğim bir yöntem var mı?Python

Yalnızca statik üye işlevlerine sahip ve modülü kaldırırken veritabanı bağlantısını temizlemenin gerektiği basit bir sınıfa sahibiz.

Örnekleri olmayan modüller veya sınıflar için __del__ yöntemi olacağını umuyor muydu?

class Foo: 

    def __init__(self): 
     print "constructor called." 

    def __del__(self): 
     print "destructor called." 
+0

siz "modül silme" ile ne demek istiyorsunuz? Bunun ne zaman olduğunu düşünüyorsun? –

+0

sadece statik üye fonksiyonlarına sahip basit bir sınıfa sahip ve modülü boşaltırken veritabanı bağlantısını temizlememiz gerekiyor. Örnekleri olmayan modüller veya sınıflar için bir __del__ yöntemi olacağını umuyordu? – Dan

+0

@Dan: Lütfen soruyu yeni bilgilerle güncelleyin; kendi sorunuz hakkında yorum yapma. Ayrıca, bir modülün boşaltılması için kullanım durumu nedir? Neden bunu yaptın? –

cevap

17

Hangi sınıfı tahrip ederken? Modülü söyledin mi?

Modülünüz, tercüman durana kadar yatar. Eğer "atexit" modülü kullanarak o anda çalışmasına şey ekleyebilirsiniz:

import atexit 
atexit.register(myfunction) 

EDIT: Yorumlarınızı dayanarak.

Bunu bir yok edici olarak istemediğinizden, yukarıdaki yanıtım doğrudur. Sadece (isterseniz veya statik yöntemi) Başka bir fonksiyonu def ve atexit ile kayıt: Artık

def close_database(): 
    proceed_to_close() 

import atexit 
atexit.register(close_database) 

hızlı bir not tanımına.

Sınıfın hiçbir örneği olmadığını söylemiştiniz. Öyleyse neden ders yapıyorsunuz? Fonksiyonları neden modül seviyesinde tanımlamıyorsunuz?

class DataBase(object): 
    @staticmethod 
    def execute_some_query(query): 
     code_here() 
     some_code() 
    @staticmethod 
    def close_database(): 
     proceed_to_close() 
import atexit ; atexit.register(DataBase.close_database) 

ve kullanma:

from database import DataBase 
DataBase.execute_some_query(query) 

Sen database.py yerine bu yapabileceğini modülleri

Örnek yerine database.py tanımlama ... birinci sınıf nesneleri önbelleğe ve yalnızca bir kez ithal vardır :

def execute_some_query(query): 
    code_here() 
    some_code() 

def close_database(): 
    proceed_to_close() 
import atexit ; atexit.register(close_database) 

daha iyisi

import database 
database.execute_some_query(query) 

Veya: Kullanım sqlalchemy ve kendi veritabanı arabirimi oluşturma tüm bu zahmete kaçınmaktır.

-1

del yöntemi kullanın. Arandığında bazı nüanslar vardır ve istisnalar ve alt sınıflandırmaların __del__'da nasıl ele alınması gerektiği konusunda, official docs'u okuduğunuzdan emin olun.

Terminoloji hakkında da kısa bir not: python'da module kodunuzun bulunduğu dosyadır ... özünde bir ad alanı. Tek bir modül birçok sınıf, değişken ve fonksiyon içerebilir. __del__ yöntemi, modülde değil, sınıfta bulunur.

+0

. Eğer __del__ kullanırsanız, gc nesneyi toplamaz, bu yüzden genel olarak mümkün ise __del__ önlemek daha iyidir. –

+1

__init__ yapıcı değildir http://docs.python.org/reference/datamodel.html#object.__del__ mutlaka okuyun – DasIch

+0

__init__ kurucu değil mi? Kafam karıştı ... – ismail

1

aradığınız sınıf Yıkıcı yöntem __del__ geçerli:

-1

Bpython kullanarak test edilmiştir ...

>>> import atexit 
>>> class Test(object): 
...  @staticmethod 
...  def __cleanup__(): 
...   print("cleanup") 
...  atexit.register(Test.__cleanup__) 
... 
Traceback (most recent call last): 
    File "<input>", line 1, in <module> 
    File "<input>", line 6, in Test 
NameError: name 'Test' is not defined 
+0

"Kayıt ol" çağrısını, sınıfın bir parçası olacak şekilde girdin, ancak sınıf henüz mevcut değil. Kabul edilen cevapta çeşitli örneklerle yaptığınız şeyi karşılaştırın. – DSM

+0

Ah, tamam. Sınıfın bu noktada olmadığını fark etmemiştim. – user2153867