ich ein Singleton wie dies umgesetzt haben:Python Singletons Attribut Fehler
class Test123(object):
_instance = None
def __new__(cls, *args, **kwargs):
if not cls._instance:
cls._instance = super(Test123, cls).__new__(cls, *args, **kwargs)
return cls._instance
def initialize(self):
self.attr1 = 500
self.attr2= 0
self.attr3= 0.10
def printit(self):
print self.attr1
print self.attr2
print self.attr3
I don t __init__ implementieren, da es jedes Mal, wenn ich das Singleton verwenden genannt wird, so um sie zu erhalten, rufe ich einfach initialisieren an der Anfang meines Skripts.
Jedes Mal, wenn ich es laufen:
Test123().initialize()
time.sleep(1)
Test123().printit()
ich diesen Fehler:
Traceback (most recent call last):
File "Z:\test\test123.py", line 22, in <module>
500
Test123().printit()
File "Z:\test\test123.py", line 17, in printit
print self.attr2
AttributeError: 'Test123' object has no attribute 'attr2'
Irgendwelche Ideen, was los ist? Ich benutze einen anderen Singleton und es tut das nicht. Außerdem wird Attr1 gut gedruckt, ich bin sehr verwirrt. Könnte es etwas mit der Benennung zu tun haben, vielleicht hat ein anderer Singleton ein Attribut namens attr2?
EDIT: das Testfall scheint gut zu funktionieren, nachdem es Repo geändert, so ist hier der eigentliche Code
import MySQLdb
class DataAccessLayer():
_instance = None
def __new__(cls, *args, **kwargs):
if not cls._instance:
cls._instance = super(DataAccessLayer, cls).__new__(cls, *args, **kwargs)
return cls._instance
def initialize(self):
#init local connection
self.dalConnection = 0
try:
self.dalConnection = MySQLdb.connect('localhost', 'root', 'awesomepassword', 'arb');
except MySQLdb.Error, e:
print "Error %d: %s" % (e.args[0],e.args[1])
def __del__(self):
self.dalConnection.close()
def addrow(self):
try:
cur = self.dalConnection.cursor()
cur.close()
self.dalConnection.commit()
except MySQLdb.Error, e:
print "Error %d: %s" % (e.args[0],e.args[1])
DataAccessLayer().initialize()
DataAccessLayer().addrow()
Schafft diesen Fehler:
Traceback (most recent call last):
File "Z:\test\DataAccess.py", line 36, in <module>
DataAccessLayer().addrow()
File "Z:\test\DataAccess.py", line 25, in addOption
cur = self.dalConnection.cursor()
AttributeError: DataAccessLayer instance has no attribute 'dalConnection'
Exception AttributeError: "DataAccessLayer instance has no attribute 'dalConnection'" in <bound method DataAccessLayer.__del__ of <__main__.DataAccessLayer instance at 0x00000000022A2748>> ignored
Funktioniert für mich. Haben Sie auch einen Fehler mit dem Testfall oder nur im echten Programm? Welche Python-Version? – doublep
nvm, habe gerade den Testfall erneut versucht, scheint gut zu funktionieren (ich habe es von einem anderen Repo gestartet.) –
Python hat ein Designmuster namens [Borg] (http://stackoverflow.com/questions/1318406/why- is-the-borg-pattern-besser-als-das-singleton-pattern-in-python), das oft als besser angesehen wird als Singletons. – katrielalex