2016-03-16 2 views
0

У меня есть простой класс для извлечения запроса из базы данных.Использование класса без вызова конструктора в python

# myClass.py 
class DB: 
    def __init__ (self, host, user, password): 
     self.conn = MySQLdb.connect("localhost","****","****","***") 
     self.conn.set_character_set('utf8mb4') 
     cursor = self.conn.cursor() 
     cursor.execute('SET NAMES utf8mb4;') 
     cursor.execute('SET CHARACTER SET utf8mb4;') 
     cursor.execute('SET character_set_connection=utf8mb4;') 
    def query(self, q): 
      cursor = self.conn.cursor() 
      cursor.execute(q) 
      return cursor 

Если я использую ниже запрос с ним работает нормально,

from myClass import DB 
q = DB("..", "..", "..", "..") 
_fetch = q.query("... ") 

Однако, если я хотел бы избавиться от второй линии, так как я объявляющего пользователю, передайте, хозяин .. в MyClass .py

Так что, когда я пытаюсь

from myClass import DB 
_fetch = DB.query("... ") 

это не позволит мне подключиться, даже если я удалить self, ключевое слово для запроса

+0

такой же, как http://stackoverflow.com/questions/7396092/is-there-a-static-constructor-or-static-initializer-in-python просто вызовите метод на уровне класса –

+0

Посмотрите на использование декоратора '@ classmethod'. –

+0

Итак, почему бы просто не удалить аргументы и использовать 'DB(). Query()'? Или создайте метод класса, и в этом классе создайте экземпляр. –

ответ

0

Вы могли бы попробовать что-то вроде:

# myClass.py 

# code will be executed only once a the first import 
conn = MySQLdb.connect("localhost","****","****","***") 
conn.set_character_set('utf8mb4') 
cursor = conn.cursor()  
cursor.execute('SET NAMES utf8mb4;') 
cursor.execute('SET CHARACTER SET utf8mb4;') 
cursor.execute('SET character_set_connection=utf8mb4;') 

class DB: 
    # class attribute shared among all DB instance 
    cursor = conn.cursor() 
    # class method 
    @classmethod 
    def query(cls, q): 
     cls.cursor.execute(q) 
     return cursor 
+0

извините, но все равно не работает. Я не получаю выход из базы данных. Даже замечательная ошибка. – ANW

+0

А как насчет ответа @ germn? –

0

Вы можете создать объект класса из них, а затем просто импортировать и использовать его:

# myClass.py 
class DB: 
    def __init__ (self, host, user, password): 
     # ... 

db = DB("..", "..", "..", "..") # Create object ones. 

Где-то в другом модуле:

from myClass import db 

db.query("... ") 
+0

Не уверен, что это хорошая практика, чтобы добавить 'db = DB ('..')' в конце 'myClass.py'. Я хотел бы изучить python надлежащим образом, и это кажется взломом. – ANW

+1

Это не hack: https://pythonconquerstheuniverse.wordpress.com/2010/10/20/a-globals-class-pattern-for-python/ –

+0

@ANW, это не взломать. Если вам это не нравится, только я могу посоветоваться, чтобы удалить params из init и сделать ваш одноклассник DB. http://stackoverflow.com/q/6760685/1113207 –

Смежные вопросы