Python singleton attribute error
Python singleton attribute error
我有一个像这样实现的单例:\n
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
\n我没有实现__init__,因为每次使用单例时都会调用它,所以为了解决这个问题,我只需在脚本开始时调用initialize。\n每次运行它时:\n
Test123().initialize() time.sleep(1) Test123().printit()
\n我得到以下错误:\n
Traceback (most recent call last): File "Z:\test\test123.py", line 22, in500 Test123().printit() File "Z:\test\test123.py", line 17, in printit print self.attr2 AttributeError: 'Test123' object has no attribute 'attr2'
\n有任何想法发生了什么?我正在使用另一个单例,它没有出现这个问题。而且,attr1可以正常打印,我很困惑。可能与命名有关,也许是另一个单例有一个名为attr2的属性吗?\n编辑:在我更改了存储库之后,测试用例似乎工作正常,所以这是实际代码\n
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()
\n创建了以下错误:\n
Traceback (most recent call last): File "Z:\test\DataAccess.py", line 36, inDataAccessLayer().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 > ignored
Python中的单例模式是一种常见的设计模式,它用于确保一个类只能创建一个实例。然而,在某些情况下,使用单例模式可能会导致"AttributeError: type object 'MySingleton' has no attribute 'instance'"错误。
出现这个错误的原因是,在单例模式中,通过将类的实例保存为类属性来确保只有一个实例。然而,如果在定义类时没有为类属性赋值,或者在访问类属性时出现错误,就会出现上述错误。
为了解决这个问题,可以在类的定义中为类属性赋一个初始值,这样就可以确保在访问类属性时不会出现错误。以下是修复错误的示例代码:
class MySingleton(object): instance = None def __new__(cls, *args, **kwargs): if cls.instance is None: cls.instance = super(MySingleton, cls).__new__(cls, *args, **kwargs) return cls.instance
在这个示例代码中,我们为类属性"instance"赋了一个初始值"None"。在类的构造函数中,我们检查类属性"instance"是否为"None",如果是,则创建一个新的实例并将其赋值给"instance",否则返回"instance"。这样就确保了只有一个实例被创建。
通过这种方式,我们可以避免出现"AttributeError: type object 'MySingleton' has no attribute 'instance'"错误,并确保只有一个实例被创建和访问。这种修复方法在Python中是常见且有效的解决单例模式中出现的错误的方法。
Python中的单例属性错误是由于DataAccessLayer
是一个旧式类而导致的。解决方法是将其改为新式类class DataAccessLayer(object): ...
。
根据Python文档中的描述,类有两种类型:新式类和经典类。新式类是可调用的对象,通常作为它们自己的实例的工厂。经典类是在调用时创建并返回一个新的类实例。如果经典类具有__init__()
方法,调用类对象时会调用该方法进行初始化。
根据这些信息,我们可以推断出,原始的DataAccessLayer
类是一个经典类。经典类在调用时需要传入初始化参数,如果没有__init__()
方法,则需要无参调用。
通过将DataAccessLayer
类改为新式类,我们可以解决这个问题。改为class DataAccessLayer(object): ...
后,该错误得以解决。
虽然这样解决了问题,但还需要进一步解释吗?