Ошибка одноэлементного атрибута Python - PullRequest
2 голосов
/ 25 марта 2012

У меня синглтон реализован так:

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?

РЕДАКТИРОВАТЬ: после смены репозитория тестовый сценарий работает нормально, поэтому вот фактический код

    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 ]

2 голосов
/ 25 марта 2012

Ваш DataAccessLayer - класс в старом стиле. Попробуйте class DataAccessLayer(object): ....

Обновление:

Типы классов

Типы классов или «классы нового стиля» могут быть вызваны. Эти объекты обычно действуют как фабрики для новых экземпляров самих себя, но возможны варианты для типов классов, которые переопределяют __new __ (). Аргументы вызова передаются __new __ () и, в типичном случае, __init __ () для инициализации нового экземпляра.

Классические классы

Объекты класса описаны ниже. Когда вызывается объект класса, создается и возвращается новый экземпляр класса (также описанный ниже). Это подразумевает вызов метода класса __init __ (), если он есть. Все аргументы передаются методу __init __ (). Если метод __init __ () отсутствует, класс должен вызываться без аргументов.

источник: ссылка на питон

0 голосов
/ 25 марта 2012

Немного не по теме, но ... Мне это вообще не кажется питоническим.Я бы попытался написать декоратор класса Singleton, чтобы я мог сделать

@Sigleton
class MySingleton(object):
    pass

Вы также можете использовать повторно, если быстро в любое время, если вам это понадобится снова ...

Примечание: это может сделатьНебольшой беспорядок в метаданных (MySingleton как экземпляр Singleton, а не MySingleton), но, возможно, functools.wraps может как-то помочь ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...