Python单例属性错误

时间:2012-03-24 21:04:57

标签: python attributes singleton

我有一个像这样实现的单身人士:

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

我没有实现__init__,因为每次使用单例时都会调用它,所以为了解决它,我只需在脚本开头调用initialize。

每当我运行它时:

Test123().initialize()
time.sleep(1)
Test123().printit()

我收到此错误:

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'

任何想法是怎么回事?我正在使用另一个单身人士而且它没有这样做。另外,attr1打印得很好,我很困惑。可能它与命名有关,也许其他一些单例有一个名为attr2的属性?

编辑:我更改了repo后,测试用例似乎工作正常,所以这是实际的代码

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

创建此错误:

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

2 个答案:

答案 0 :(得分:2)

你的DataAccessLayer是一个旧式的课程。试试class DataAccessLayer(object): ...

更新

  

班级类型

     

类类型或“新样式类”是可调用的。这些对象通常作为新实例的工厂,但是对于覆盖__new __()的类类型可能存在变化。调用的参数传递给__new __(),在典型情况下,传递给__init __()以初始化新实例。

     

经典课程

     

类对象如下所述。调用类对象时,会创建并返回一个新的类实例(也在下面描述)。这意味着调用类的__init __()方法(如果有)。任何参数都传递给__init __()方法。如果没有__init __()方法,则必须不带参数调用该类。

来源:the python reference

答案 1 :(得分:0)

稍微偏离主题,但......这对我来说似乎并不像是pythonic。我会尝试编写一个装饰器类Singleton,所以我可以做

@Sigleton
class MySingleton(object):
    pass

如果您再次需要,也可以随时快速重复使用......

注意:它可以使元数据小混乱(MySingleton是Singleton的实例,而不是MySingleton),但也许functools.wraps可以帮助某种方式......