1

次のようなコードを見ました ( https://github.com/daydayfree/diggit/blob/master/model/model.pyから):

from database import Database
...
class Model(object):
    @property
    def db(self): return Database()

    def insert(self, documents):
        return self.db.insert(self.table, documents)
...

主な目的は、インスタンス@propertyのメソッドへのアクセスを提供することですが、正しいですか?Database()

だから私はそれを次のように書き直すことができます:

from database import Database
...
class Model(object):
    def __init__(self):
        self.db = Database()

    def insert(self, documents):
        return self.db.insert(self.table, documents)

from database import Database
...
class Model(object):
    def db(self):
        return Database()

    def insert(self, documents):
        return self.db().insert(self.table, documents)
...

? そうでない場合、それらの違いは何ですか?

4

3 に答える 3

1

デコレーターは、メソッドの@property呼び出しをインスタンスの呼び出しのように見せるために使用されます。

したがって、Modelインスタンスがある場合は、属性のように見えますが、実際にはメソッドを呼び出すことで、新しいデータベース オブジェクトを取得できます。dbdbdb

>>> a = Model()
>>> a.db
Database()

最初の「書き換え」の例では、クラスのメソッドでdb属性を作成します。これで、属性__init__を呼び出すたびに、以前のように新しいオブジェクトではなく、毎回同じオブジェクト (呼び出し中に作成されたもの)が取得され ます。 db Database__init__

これを想像するには、python 標準ライブラリから置き換えることreturn Database()ができます。return random.random()元の実装では、 を呼び出すたびに新しい番号が返されますdbrandom.random()提案された実装では、(メソッドで) 1 回だけ呼び出され、__init__出力が に保存されたため、毎回同じ数が返されdbます。

2 番目の「書き換え」はdb、メソッドとして (つまり、開き括弧と閉じ括弧を使用して) 呼び出すことを除いて、基本的に元の実装と同じです。

>>> a = Model()
>>> a.db()
Database()
于 2013-08-20T05:42:53.837 に答える
0

2 番目の方法と同様に呼び出されると、新しい Database インスタンスが作成されます。つまり、 を呼び出すたびにinsert、新しい Database インスタンスが作成され、その Database インスタンスを指す参照が残っていないため、その Database インスタンスが挿入されてから削除されます。

最初の選択肢では、常に同じインスタンスにアクセスします。これは、insert を呼び出した後も、データベース オブジェクトがまだそこにあることを意味します。

于 2013-08-20T05:35:11.000 に答える