1

Python は初めてで、コード構造の基本を学び始めています。Github で作業している基本的なアプリがあります。

私の単純なアプリでは、ユーザーがメモのリストを作成および編集できる基本的な「Evernote のような」サービスを作成しています。初期の設計では、Note オブジェクトと Notepad オブジェクトを使用していましたが、これは実質的にメモのリストです。現在、次のファイル構造があります。

Notes.py
| 
|------ Notepad (class)
|------ Note (class)

私の現在の理解と実装から、これは Notepad クラスと Note クラスを持つ「Notes」モジュールに変換されるため、インポートを行うときは、「from Notes import Notepad / from Notes import Note」と言います。

これは正しいアプローチですか?私は、Java の習慣から、Notes 用のフォルダーと 2 つのクラスを個別のファイルとして持つべきだと感じています。

ここでの私の目標は、ベスト プラクティスとは何かを理解することです。

4

2 に答える 2

4

クラスがかなり小さい限り、それらを 1 つのファイルに入れます。必要に応じて、後で移動することもできます。実際、大規模なプロジェクトでは、かなり深い階層を持ちながら、よりフラットな階層をユーザーに公開するのが一般的です。そのため、後で移動してnotes.Noteも、クラスがより深く移動した場合でも保持したい場合は、インポートするNoteだけで簡単になり、ユーザーはそこから取得できます。あなたはそれをする必要はありませんが、できます。そのため、後で気が変わっても API を保持したい場合でも問題ありません。note.path.to.module.Notenotes

于 2013-05-28T01:59:03.507 に答える
1

私自身も同様のアプリケーションで作業しています。これが最善のアプローチだとは言えませんが、うまくいきました。クラスは、ユーザーがリクエスト (http リクエスト、これは webapp) を行うときにデータベース (コンテキスト) とやり取りすることを目的としています。

# -*- coding: utf-8 -*-
import json
import datetime

class Note ():
    """A note. This class is part of the data model and is instantiated every
    time there access to the database"""
    def __init__(self, noteid = 0, note = "", date = datetime.datetime.now(), context = None):
        self.id = noteid
        self.note = note
        self.date = date
        self.ctx = context #context holds the db connection and some globals

    def get(self):
        """Get the current object from the database. This function needs the
        instance to have an id"""
        if id == 0:
            raise self.ctx.ApplicationError(404, ("No note with id 0 exists"))
        cursor = self.ctx.db.conn.cursor()
        cursor.execute("select note, date from %s.notes where id=%s" % 
                       (self.ctx.db.DB_NAME, str(self.id)))
        data = cursor.fetchone()
        if not data:
            raise self.ctx.ApplicationError(404, ("No note with id " 
                                                 + self.id + " was found"))
        self.note = data[0]
        self.date = data[1]
        return self

    def insert(self, user):
        """This function inserts the object to the database. It can be an empty
        note. User must be authenticated to add notes (authentication handled
        elsewhere)"""
        cursor = self.ctx.db.conn.cursor()
        query = ("insert into %s.notes (note, owner) values ('%s', '%s')" % 
                       (self.ctx.db.DB_NAME, str(self.note), str(user['id'])))
        cursor.execute(query)
        return self

    def put(self):
        """Modify the current note in the database"""
        cursor = self.ctx.db.conn.cursor()
        query = ("update %s.notes set note = '%s' where id = %s" % 
                 (self.ctx.db.DB_NAME, str(self.note), str(self.id)))
        cursor.execute(query)
        return self

    def delete(self):
        """Delete the current note, by id"""
        if self.id == 0:
            raise self.ctx.ApplicationError(404, "No note with id 0 exists")
        cursor = self.ctx.db.conn.cursor()
        query = ("delete from %s.notes where id = %s" % 
                 (self.ctx.db.DB_NAME, str(self.id)))
        cursor.execute(query)

    def toJson(self):
        """Returns a json string of the note object's data attributes"""
        return json.dumps(self.toDict())

    def toDict(self):
        """Returns a dict of the note object's data attributes"""
        return {
                "id" : self.id,
                "note" : self.note,
                "date" : self.date.strftime("%Y-%m-%d %H:%M:%S")
                }


class NotesCollection():
    """This class handles the notes as a collection"""
    collection = []
    def get(self, user, context):
        """Populate the collection object and return it"""
        cursor = context.db.conn.cursor()
        cursor.execute("select id, note, date from %s.notes where owner=%s" % 
                       (context.db.DB_NAME, str(user["id"])))
        note = cursor.fetchone()
        while note:
            self.collection.append(Note(note[0], note[1],note[2]))
            note = cursor.fetchone()
        return self

    def toJson(self):
        """Return a json string of the current collection"""
        return json.dumps([note.toDict() for note in self.collection])

私は個人的に python を "やり遂げる" 言語として使用しており、細かいことは気にしません。これは上記のコードに示されています。ただし、1 つアドバイスがあります。Python にはプライベート変数もメソッドもないため、わざわざ作成しようとしないでください。生活を楽にし、コーディングを高速化し、完成させます

使用例:

class NotesCollection(BaseHandler):
    @tornado.web.authenticated
    def get(self):
        """Retrieve all notes from the current user and return a json object"""
        allNotes = Note.NotesCollection().get(self.get_current_user(), settings["context"])
        json = allNotes.toJson()
        self.write(json)

    @protected
    @tornado.web.authenticated
    def post(self):
        """Handles all post requests to /notes"""
        requestType = self.get_argument("type", "POST")
        ctx = settings["context"]
        if requestType == "POST":

            Note.Note(note = self.get_argument("note", ""), 
                      context = ctx).insert(self.get_current_user())
        elif requestType == "DELETE":
            Note.Note(id = self.get_argument("id"), context = ctx).delete()
        elif requestType == "PUT":
            Note.Note(id = self.get_argument("id"),
                              note = self.get_argument("note"),
                              context = ctx).put()
        else:
            raise ApplicationError(405, "Method not allowed")

デコレータを使用することで、メイン コードからユーザー認証とエラー処理を取得しています。これにより、より明確になり、保守が容易になります。

于 2013-05-28T01:57:32.390 に答える