2012-01-01 5 views
2

すべてのMySQL操作を含むクラスを作成したいと思います。MySQL DBクラスのインスタンス化

今、私はクラスをインスタンス化することもできません。

Traceback (most recent call last): 
    File "./compare.py", line 71, in <module> 
    main() 
    File "./compare.py", line 67, in main 
    db = Table.mysqlconnect() 
TypeError: unbound method mysqlconnect() must be called with Table instance as first argument (got nothing instead) 

コード:

import MySQLdb 

class Table(object): 
    """ Using Databases """ 
    def __init__(self, db, name): 
     self.db = db 
     self.name = name 
     self.cur = self.db.cursor() 

    def mysqlconnect(): 
     conn = MySQLdb.connect (host = "mysql.blah.com", 
      user = "user", 
      passwd = "password", 
      db = "database") 
     cursor = conn.cursor() 
     cursor.execute ("SELECT VERSION()") 
     row = cursor.fetchone() 
     print "server version:", row[0] 
     cursor.close() 
     conn.close() 



def main(): 

    db = Table.mysqlconnect() 
    pass 

if __name__ == '__main__': 
    main() 
+1

9.3.2 @ Christianの最初のリンクの "Class Objects"(リンクされたビットの少し上です)。これは良い、一般的な紹介を与えるはずです。 [このリンク](http://en.wikibooks.org/wiki/Python_Programming/Classes)はもう少し高度ですが、うまくいけば助けになるべきです。 – Ben

+0

ありがとうございました! – Cmag

答えて

3

あなたはそれらのドキュメントを読んで、しかし、あなたが探していることである必要があります。

db = Table() 
db.mysqlconnect() 

短い説明:mysqlconnectはあなたTableクラスのインスタンスメソッドです。

詳細説明:Tableは抽象的な概念です。あなたはPythonインタプリタにそれについて何をすべきかを教えてきましたが、実際にはまだ作成していません。それはあなたのクラスの青写真のようなものです。使用する前に、またはその一部として定義されているメソッドを使用してください*実際に最初にビルドする必要があります。

これは、以下のときに行うことです。db = Table()これはPythonインタプリタに、私がdbという変数を持っていることを伝え、Table()のインスタンスにします。これで、インスタンスメソッドを呼び出すことができます(インスタンスメソッドはインスタンス上でのみ動作するため)、結果を得ることができます。

*クラスを最初にインスタンス化せずに使用できるclassメソッドと呼ばれるものがありますが、ドキュメントを読むとそのことがわかります。

3

エラーが正確に右である:つまり

TypeError: unbound method mysqlconnect() must be called with Table instance as first argument (got nothing instead)

、あなたがのinstanceクラス名(Table)を使用していませんクラスTable

these examplesを読んで、彼らはあなたが望むものを正確に行います。クラスやオブジェクトを読みたい場合はPython manual chapterが優れています。

+0

uhmの読書を続けます。あなたがリンクしている記事では、クラスとMySQLの使い方がよくわかりません。私の問題はクラスを理解するのではなく、mysql関数自体ではないと思います...リンクに感謝します。 – Cmag

+0

例を勉強すれば、両方を学ぶかもしれません。 :) –

0

また、mysqlconnectは、クラス属性にアクセスするためにselfを使用する必要があります。たとえば:

import MySQLdb 
class Table: 
    def __init__(self, host, user, passwd, name) 
     self.db = MySQLdb.connect (host = host, 
      user = user, 
      passwd = passwd, 
      db = name) 
     self.cursor = self.db.cursor() 
    def mysqlconnect(self): 
     self.cursor.execute ("SELECT VERSION()") 
     row = cursor.fetchone() 
     print "server version:", row[0] 
     self.cursor.close() 
     self.db.close() 

# Main must be outside the table class 
def main(): 
    tableInstance = Table("mysql.blah.com", "user", "password", "database") 
    tableInstance.mysqlconnect() 

if __name__ == '__main__': 
    main() 
+1

'main()'関数が 'Table()'クラスのスコープ外でなければならないことをあなたの投稿に編集しました。これは今すぐモデレーションキューにあります。 'Table()'クラスの一部にすると 'mysqlconnect'と同じように' main() 'を呼び出してアクセスすることはできません。最初に 'Table'インスタンスが必要です。 – tkone

+0

ありがとうございます。ここの識別システムは本当に私を捨ててしまった。 – chameco

+0

テキストエディタで自分のコードを書いてコピーアンドペーストし、 '{}'ボタンを押してコードフォーマットに変換するのが最も簡単です。 – tkone

関連する問題