2

以下は、エラーを修正するための助けを得る、またはこれを記述するためのより良い方法を理解することを望んでいるエラーを提供するサンプルコードです。mysql_connection と呼ばれる mysql の「スーパー」クラスがあります。このクラスでは、データベースへの接続が行われます。その中にいくつかのメソッドもあります。単に「select version()」を実行して、接続/クエリが機能していることを示すもの。次に、この例では、スーパー クラスを継承する「table」という新しいサブクラスをインスタンス化する「chktable」メソッドがあります。クラスをインスタンス化した後、サブクラス内のメソッドを呼び出します。このメソッドは、スーパークラスのクエリ メソッドを使用して「'tbl name' のようなテーブルを表示する」を実行しようとします。ここでエラーが発生します。

import mysql.connector
from mysql.connector import errorcode
from mysql.connector.cursor import MySQLCursor

class mysql_connection(object):
    def __init__(self, **kwargs):
        self.connection_options = {}
        self.connection_options['user'] = 'root'
        self.connection_options['password'] = ''
        self.connection_options['host'] = '192.168.33.10'
        self.connection_options['port'] = '3306'
        self.connection_options['database'] = "test"
        self.connection_options['raise_on_warnings'] = True
        self.connect()

    def connect(self):
        try:
            self.cnx = mysql.connector.connect(**self.connection_options)
        except mysql.connector.Error as err:
            if err.errno == errorcode.ER_ACCESS_DENIED_ERROR:
                print "Something is wrong with your user name or password"
            elif err.errno == errorcode.ER_BAD_DB_ERROR:
                print "Database does not exists" 
            else:
                print err

    def query(self, statement, data=''):
        cursor = MySQLCursor(self.cnx)
        cursor.execute(statement)
        result = cursor.fetchall()
        cursor.close
        return result

    def get_version(self):
        print self.query("select version()")

    def chktable(self, tb_name):
        tab = table(name=tb_name)
        tab.check_table()

class table(mysql_connection):
    def __init__(self, **kwargs):
        self.name = kwargs['name']

    def check_table(self):
        return super(table, self).query("show tables like '{}".format(self.name))

conn = mysql_connection()
conn.get_version()
conn.chktable("test")

私が得るエラーは次のとおりです。

$ python example.py
[(u'5.1.73',)]
Traceback (most recent call last):
  File "example.py", line 50, in <module>
    conn.chktable("test")
  File "example.py", line 39, in chktable
    tab.check_table()
  File "example.py", line 46, in check_table
    return super(table, self).query("show tables like '{}".format(self.name))
  File "example.py", line 28, in query
    cursor = MySQLCursor(self.cnx)
    AttributeError: 'table' object has no attribute 'cnx'

スーパークラスへのコールバックと、それがサブクラスでどのように機能するかを完全には理解していないため、それがおそらく私の問題です。また、これを達成するためのより良い方法があるかどうかも知りたいです。私はサブクラスを完全に取り除くことができると考えていましたが、私が作成したサブクラスが好きなので、それを回避する方法があるはずだと感じています. サブクラスをマスター クラス内に配置することもできますが、それは正しくないと思います。

4

1 に答える 1

2

Jon が指摘するように、これは継承の適切な使用法ではありません。これは「is-a」関係のためのものです。つまり、Dog は Animal から継承します。なぜなら、Dog は動物だからです。ただし、テーブルは接続ではありません。テーブルは接続を使用する場合がありますが、それは単純に接続のインスタンスをテーブル内のインスタンス変数に割り当てる必要があることを意味します。

また、継承関係では、通常、スーパークラスがそのサブクラスについて知る正当な理由はありません。これは、chktableメソッドの場合と異なります。

(実際に発生しているバグは、テーブルの__init__でスーパークラス メソッドを呼び出していないためですが、構造を修正した方がよいでしょう。)

于 2014-12-06T09:55:56.387 に答える