एक सामान्य एकेए मजबूत संदर्भ वह है जो संदर्भित वस्तु को जीवित रखता है: सीपीथॉन में, प्रत्येक वस्तु उस (सामान्य) संदर्भों की संख्या रखती है जो मौजूद है (इसकी "संदर्भ गणना" या आरसी के रूप में जाना जाता है) जैसे ही आरसी शून्य तक पहुंच जाती है (कभी-कभी पीढ़ी के निशान और स्वीप पास भी थोड़ी देर में कचरा इकट्ठा "संदर्भ लूप")।
जब आप किसी ऑब्जेक्ट को जीवित रहने की इच्छा नहीं रखते हैं, क्योंकि कोई अन्य इसे संदर्भित करता है, तो आप एक "कमजोर संदर्भ" का उपयोग करते हैं, संदर्भ की एक विशेष विविधता जो आरसी में वृद्धि नहीं करती है; विवरण के लिए the docs देखें। बेशक, चूंकि संदर्भित वस्तु को दूर किया जा सकता है यदि अन्यथा संदर्भित नहीं किया जाता है (सामान्य सामान्य की बजाय कमजोर रेफरी का पूरा उद्देश्य!), तो ऑब्जेक्ट का उपयोग करने का प्रयास करने पर ऑब्जेक्ट को संदर्भित करने की आवश्यकता है यह दूर चला गया है - और उस अलर्ट को आप जो अपवाद देख रहे हैं उसे बिल्कुल दिया गया है।
अपने कोड में ...:
def __init__(self,dbname):
tmp = sqlite.connect(dbname)
self.con = tmp.cursor()
def __del__(self):
self.con.close()
tmp
कनेक्शन के लिए एक सामान्य संदर्भ है ... लेकिन यह एक स्थानीय चर है, इसलिए इसे __init__
के अंत में चला जाता है। (विशेष रूप से नामित ;-) कर्सर self.con
रहता है, लेकिन यह आंतरिक रूप से कनेक्शन के लिए एक WEAK रेफरी रखने के लिए आंतरिक रूप से कार्यान्वित किया जाता है, इसलिए tmp
करता है जब कनेक्शन दूर हो जाता है। तो __del__
में .close
पर कॉल विफल हो जाता है (क्योंकि कर्सर को स्वयं को बंद करने के लिए कनेक्शन का उपयोग करने की आवश्यकता है)।
सरल समाधान निम्नलिखित छोटे परिवर्तन है:
def __init__(self,dbname):
self.con = sqlite.connect(dbname)
self.cur = self.con.cursor()
def __del__(self):
self.cur.close()
self.con.close()
मैं भी कनेक्शन और कर्सर के लिए CUR के लिए चोर उपयोग करने का अवसर ले लिया है, लेकिन अजगर कोई आपत्ति नहीं होगा अगर आप उन स्वैप करने के लिए उत्सुक हैं (आप केवल पाठकों को परेशान छोड़ देंगे ;-)।
स्रोत
2009-09-27 00:27:08
समस्या यह है कि मुझे नहीं पता कि "कमजोर" या "मजबूत" संदर्भ का अर्थ क्या है। मैं यह भी नहीं जानता कि संदर्भ का क्या अर्थ है। – Verrtex