免責事項:この質問は宿題に関連しています。私は解決策を期待していませんが、何が求められているのか、そしてこの宿題の練習の(可能な)有用性についてのより良い理解を望んでいます。
この質問は、PythonのMySQLdbモジュールの使用と、タプルのタプル(MySQLdbのデフォルトのように)の代わりに結果セット(および場合によってはその行)をより適切に表現する方法についてのレッスンの後に尋ねられました。
問題は次のとおりです。build_row関数によって返されるDataRowクラスが別のメソッドを持つようにclassFactory.pyソースコードを変更します。
retrieve(self, curs, condition=None)
selfは(通常どおり)メソッドが呼び出されているインスタンスであり、cursは既存のデータベース接続上のデータベースカーソルであり、condition(存在する場合)は、受信したすべての行に当てはまる必要がある条件の文字列です。取得メソッドはジェネレーターである必要があり、完全に使い果たされるまで結果セットの連続する行を生成します。各行は、DataRowタイプの新しいオブジェクトである必要があります。
def build_row(table, cols):
"""Build a class that creates instances of specific rows"""
class DataRow:
"""Generic data row class, specialized by surrounding function"""
def __init__(self, data):
"""Uses data and column names to inject attributes"""
assert len(data)==len(self.cols)
for colname, dat in zip(self.cols, data):
setattr(self, colname, dat)
def __repr__(self):
return "{0}_record({1})".format(self.table, ", ".join(["{0!r}".format(getattr(self, c)) for c in self.cols]))
DataRow.table = table
DataRow.cols = cols.split()
return DataRow
- 関数定義内にクラスを作成する目的は何ですか?これは一般的にプロの開発者によって行われますか?もしそうなら、利点は何ですか?
- データベースカーソルがメソッドの(明示的な)引数であるのはなぜ
retrieve
ですか?データベースカーソルは、このスクリプトの範囲外で参照されるべきではありませんか(データベース接続が確立されたとき)? - (現在)
build_row
関数は2つの引数(table
および)を受け入れcols
、(例として)「exampleTable_record(fieldA、fieldB、fieldC)」のような文字列を返すと言うのは正しいですか? - メソッドが正常に追加されたら
retrieve
、何がbuild_row
返されると期待できますか?
前に触れたように、なぜメソッドを追加するように求められているのかがわかっていれば、retrieve
この問題をどのように攻撃するかについてより良いアイデアがあるかもしれません。