2012-03-13 2 views
0

У меня проблема с использованием экземпляра класса в Python. Ive создал новый класс ora, который наследует класс connect из пакета cx_Oracle. Когда я пытаюсь ту запустить этот код, я Recive информацияЭкземпляр класса в Python

Файл "pyt.py", строка 12, в myquery ora.myConnect.cursor() AttributeError: объект 'NoneType' не имеет атрибута 'курсор'

Таким образом, Python canwom распознает, что в ora.myConnect хранится ссылка на экземпляр. Я не знаю t know what can be reason of this error and what it с неправильным кодом.

from cx_Oracle import connect 

class ora(connect): 
    myConnect = None 

    def __init__(self,connstr):  
    ora.myConnect = connect.__init__(self,connstr) 


    def myquery(self): 
     ora.myConnect.cursor() 
     ora.myConnect.cursor.execute("SELECT * FROM table") 
     ora.myConnect.cursor.close() 



connstr = 'user/[email protected]:port/sid' 
connection = ora(connstr)  
connection.myquery()     
connection.close() 

EDIT

I ve tried to replace ora to self but still Python don т имеют доступ к примеру

from cx_Oracle import connect 

class ora(connect): 
    myConnect = None 

    def __init__(self,connstr):  
    self.myConnect = connect.__init__(self,connstr) 
    def myquery(self): 
     self.myConnect.cursor() 
     self.myConnect.cursor.execute("SELECT * FROM table") 
     self.myConnect.cursor.close() 

Ошибка: self.myConnect.cursor() AttributeError: объект 'NoneType' не имеет атрибута 'курсор'

EDIT2 Этот код работает без ООП, для меня self.myConnect sholud refere сть в экземпляр объекта, и этот объект должен содержать метод курсора()

import cx_oracle 
connstr = 'user/[email protected]:port/sid' 
connection = cx_oracle.connect(connstr)     
cursor = connection.cursor()        
cursor.execute("SELECT * FROM table") 
cursor.close() 
connection.close() 
+0

'self.myConnect = connect .__ init __ (self, connstr)' нечетно. Кажется маловероятным, чтобы метод '__init__' возвращал курсор. Вы уверены, что понимаете, как должен работать класс, который вы продлеваете? – beerbajay

+0

На основании [документации здесь] (http://cx-oracle.sourceforge.net/html/module.html#cx_Oracle.connect) Я бы сказал, что вы действительно не должны расширять 'connect', как вы это делали. Вместо этого просто вызовите 'cx_Oracle.connect()' из вашего '__init__' и сохраните соединение как' self.myConnect'. – beerbajay

+0

self.myConnect sholud возвращают ссылку на экземпляр объекта, например без ООП этот код работает импорт cx_Oracle connstr = "пользователь/пароль @ хост: порт/Сид соединение = cx_oracle.connect (connstr) курсора = соединение. курсор() курсор.execute ("SELECT * FROM table") cursor.close() connection.close() – browarq

ответ

2

Похоже, что вы хотите self:

class ora(connect): 
    myConnect = None 

    def __init__(self, connstr):  
     self.myConnect = connect.__init__(self, connstr) 

    # ... 

ora это имя класса, а не экземпляра.

Update Попробуйте следующее:

from cx_Oracle import connect 

class ora: 
    myConnect = None 

    def __init__(self, connstr):  
     self.myConnect = connect(connstr) 

    def myquery(self): 
     self.myConnect.cursor() 
     self.myConnect.cursor.execute("SELECT * FROM table") 
     self.myConnect.cursor.close() 
+0

Если вы замените 'ora'' self' на '__init__' и' myquery', ваш объект 'connection' должен быть функциональным. Какую ошибку вы получаете? – beerbajay

+0

У меня была проблема с комментариями, поэтому я добавил более подробную информацию в первое сообщение – browarq

1

Почему вы хотите self.myConnect обратиться к экземпляру connect? Это полное непонимание ООП. Пример ora: пример connect. self.cursor - это место, где вы найдете курсор.

Вот как ваш код должен выглядеть:

class ora(connect): 

    def __init__(self,connstr):  
    super(ora, self).__init__(connstr) 

    def myquery(self): 
    self.cursor.execute("SELECT * FROM table") 
    self.cursor.close() 

В любом случае, __init__ должен ничего не вернуть, поэтому установка self.myConnect для возвращаемого значения всегда будет приводить к его привязки к None.

+0

Спасибо - я не знал об этом методе супер, теперь он отлично работает – browarq

+0

Не забудьте отметить ответ как принятый, если он решил твоя проблема. –