Python singleton attribute error

7 浏览
0 Comments

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, in 
500
    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, in 
    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 > ignored

0
0 Comments

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中是常见且有效的解决单例模式中出现的错误的方法。

0
0 Comments

Python中的单例属性错误是由于DataAccessLayer是一个旧式类而导致的。解决方法是将其改为新式类class DataAccessLayer(object): ...

根据Python文档中的描述,类有两种类型:新式类和经典类。新式类是可调用的对象,通常作为它们自己的实例的工厂。经典类是在调用时创建并返回一个新的类实例。如果经典类具有__init__()方法,调用类对象时会调用该方法进行初始化。

根据这些信息,我们可以推断出,原始的DataAccessLayer类是一个经典类。经典类在调用时需要传入初始化参数,如果没有__init__()方法,则需要无参调用。

通过将DataAccessLayer类改为新式类,我们可以解决这个问题。改为class DataAccessLayer(object): ...后,该错误得以解决。

虽然这样解决了问题,但还需要进一步解释吗?

0