2009-06-03 13 views
5

में मॉड्यूल हटाने पर बुलाया जाता है क्या कोई तरीका है जिसे मैं अपने मॉड्यूल में जोड़ सकता हूं, जिसे कक्षा को नष्ट करते समय बुलाया जाएगा?विधि जो पाइथन

हमारे पास एक साधारण वर्ग है जिसमें केवल स्थिर सदस्य कार्य हैं और मॉड्यूल को अनलोड करते समय डेटाबेस कनेक्शन को साफ़ करने की आवश्यकता है।

उम्मीद कर रहा था कि __del__ विधि या तो मॉड्यूल या कक्षाओं के लिए विधि होगी जिनके पास उदाहरण नहीं हैं?

class Foo: 

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

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

"मॉड्यूल हटाना" से आपका क्या मतलब है? आपको ऐसा कब लगता है? –

+0

हमारे पास एक साधारण वर्ग है जिसमें केवल स्थिर सदस्य कार्य हैं और मॉड्यूल को अनलोड करते समय डेटाबेस कनेक्शन को साफ़ करने की आवश्यकता है। उम्मीद कर रहा था कि मॉड्यूल या कक्षाओं के लिए __del__ विधि होगी जिसमें उदाहरण नहीं हैं? – Dan

+0

@Dan: कृपया नई जानकारी के साथ प्रश्न अपडेट करें; अपने खुद के प्रश्न पर टिप्पणी मत करो। इसके अलावा, मॉड्यूल को उतारने के लिए उपयोग केस क्या है? आप ऐसा क्यों करेंगे? –

उत्तर

17

किस वर्ग को नष्ट करते समय? हालांकि आपने मॉड्यूल कहा था?

आपका मॉड्यूल तब तक रहता है जब तक दुभाषिया बंद नहीं हो जाता। आप उस समय "atexit" मॉड्यूल का उपयोग कर पर चलाने के लिए कुछ जोड़ सकते हैं:

import atexit 
atexit.register(myfunction) 

संपादित करें: अपनी टिप्पणी के आधार पर।

चूंकि आप इसे विनाशक के रूप में नहीं चाहते हैं, तो मेरा उत्तर सही है। अपनी परिभाषा पर

def close_database(): 
    proceed_to_close() 

import atexit 
atexit.register(close_database) 

अब एक त्वरित नोट: बस (यदि आप चाहें या स्थिर विधि) एक और समारोह डीईएफ़ और atexit से पंजीकृत करें।

आपने कहा कि कक्षा में कोई उदाहरण नहीं है। तो इसे कक्षा क्यों बनाते हैं? इसके बजाय मॉड्यूल स्तर में फ़ंक्शंस को परिभाषित क्यों नहीं करें? मॉड्यूल प्रथम श्रेणी की वस्तुओं, कैश की गई और केवल एक बार आयातित रहे हैं ...

उदाहरण के लिए, बजाय database.py को परिभाषित करने की:

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) 

और का उपयोग कर:

from database import DataBase 
DataBase.execute_some_query(query) 

आप इस बजाय database.py पर कर सकता है :

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

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

और इसका उपयोग वें है:

import database 
database.execute_some_query(query) 

या बेहतर अभी तक: उपयोग sqlalchemy और अपने खुद के डेटाबेस इंटरफेस बनाने के सभी इस मुसीबत से बचने के।

-1

डेल विधि का उपयोग करें। इसे कहने के लिए कुछ बारीकियां हैं, और __del__ में अपवाद और उप-वर्गीकरण को कैसे प्रबंधित किया जाना चाहिए, इसलिए official docs को पढ़ना सुनिश्चित करें।

शब्दावली पर एक त्वरित नोट भी: पायथन में module वह फ़ाइल है जिसमें आपका कोड स्थित है ... एक नामस्थान, संक्षेप में। एक मॉड्यूल में कई वर्ग, चर, और कार्य हो सकते हैं। __del__ विधि कक्षा पर स्थित है, मॉड्यूल पर नहीं।

+0

पढ़ना सुनिश्चित करें http://docs.python.org/reference/datamodel.html#object.__del__ –

+1

__init__ कन्स्ट्रक्टर नहीं है। यदि आप __del__ का उपयोग करते हैं तो यह संभव हो सकता है कि जीसी वस्तु को एकत्र न करे, इसलिए आम तौर पर यदि आप कर सकते हैं तो __del__ से बचने के लिए बेहतर है। – DasIch

+0

__init__ कन्स्ट्रक्टर नहीं है? मैं उलझन में हूं ... – ismail

1

वर्ग नाशक विधि आप देख रहे हैं __del__ है:

-1

bpython का उपयोग करके परीक्षण किया गया ...

>>> 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

आपने 'रजिस्टर' कॉल को इंडेंट किया है ताकि वह कक्षा का हिस्सा हो, लेकिन कक्षा अभी तक मौजूद नहीं है। स्वीकार्य उत्तर में विभिन्न उदाहरणों के साथ आपने जो किया उससे तुलना करें। – DSM

+0

आह, ठीक है। मुझे एहसास नहीं हुआ कि कक्षा इस समय मौजूद नहीं है। – user2153867

संबंधित मुद्दे