2016-03-16 47 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()'?或者創建一個classmethod,並在那個classmethod中創建實例。 –

回答

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

不確定在'myClass.py'的末尾添加'db = DB('..')'是否是一個好習慣我想以正確的方式學習python,這似乎是一種破解.. – ANW

+1

這不是一個黑客:https://pythonconquerstheuniverse.wordpress.com/2010/10/20/a-globals-class-pattern-for-python/ –

+0

@ANW,這不是黑客。如果你不喜歡它,只有我可以建議的方式是從init中刪除參數,並讓你的數據庫類單例。 http://stackoverflow.com/q/6760685/1113207 –

相關問題