首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python单例属性错误

Python单例属性错误
EN

Stack Overflow用户
提问于 2012-03-25 05:04:57
回答 2查看 2K关注 0票数 2

我有一个像这样实现的单例:

代码语言:javascript
复制
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。

每当我运行它时:

代码语言:javascript
复制
Test123().initialize()
time.sleep(1)
Test123().printit()

我得到了这个错误:

代码语言:javascript
复制
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之后,测试用例似乎工作得很好,所以这是实际的代码

代码语言:javascript
复制
    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()

创建此错误:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2012-03-25 05:42:23

有点跑题,但是...这在我看来一点也不像蟒蛇。我会尝试编写一个装饰器类Singleton,这样我就可以

代码语言:javascript
复制
@Sigleton
class MySingleton(object):
    pass

如果你再次需要它,你也可以在任何时候快速地重用它。

注意:它可以在元数据中搞得一团糟(MySingleton是单例的实例,而不是MySingleton),但也许functools.wraps可以以某种方式提供帮助……

票数 0
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9855613

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档