公式の定義: デコレーターは非常に有名なデザイン パターンであり、横断的な要件を持つシナリオでよく使用されます。より古典的なものには、ログ挿入、パフォーマンス テスト、トランザクション処理などが含まれます。デコレータは、この種の問題を解決するための優れた設計です。デコレータを使用すると、関数自体とは関係のない多数の関数で同じコードを抽出し、それを再利用し続けることができます。一言で言えば、デコレーターの目的は、既存のオブジェクトに機能を追加することです。
Python には、合計 3 つの組み込みデコレータが含まれています:
① staticmethod
② classmethod
③ property
通常、属性にアクセスして値を割り当てる場合、クラスとインスタンス __dict__; を扱いますが、属性アクセスを標準化したい場合は、①データ記述子、②属性関数の 2 つの方法があります。
ただし、記述子は比較的複雑で初心者にとっては使用が難しいことがわかっているため、記述子の大規模なプロセスと比較すると、property() を試してみるとよいでしょう。
property(fget=None, fset=None, fdel=None, doc=None)
次のように、calss Normal にプライベート変数 __x があると仮定します。次のコード:
#code 1 class Normal: def __init__(self): self.__x = None def getx(self): return self.__x def setx(self, value): self.__x = value def delx(self): del self.__x tN = Normal() print(tN.__count)
出力結果 (エラーが報告されました)
Traceback (most recent call last): File "C:/Users/Administrator/AppData/Local/Programs/Python/Python35/property.py", line 15, in <module> print(tN.__count) AttributeError: 'Normal' object has no attribute '__count'
なぜエラーが報告されたのですか?インスタンス tN の属性 __x はプライベート属性であり、直接アクセスできないため、内部的に定義されたメソッドのみを呼び出すことができます。 出力結果:
tN = Normal() tN.setx(10) print(tN.getx())
内部メソッドを使用すると、インスタンスのプライベート プロパティを簡単に取得できます。またはクラスの属性値;
ただし、クラス Normal の setx メソッド名を別の名前 (Normal_setx など) に変更したい場合、この関数は多くの外部の場所で使用されます。メソッドの呼び出し場所を見つける必要があります。一つずつ、そして一つ一つ変えてみてはどうでしょうか?
C言語ならできるかもしれませんが、高級言語であるPythonではどうしてこのような問題が解決できないのでしょうか?
では、上記の問題を解決するにはどうすればよいでしょうか?
実際には2つの方法があります。
方法1:プロパティ関数property()を使う
6 10
方法2:@propertyデコレーターを使う
class Normal: def __init__(self): self.__x = None def getx(self): print('getx(): self.__x=', self.__x) return self.__x def setx(self, value): self.__x = value print('setx()') def delx(self): print('delx()') del self.__x y = property(getx, setx, delx, "I'm a property") tN=Normal() tN.y=10 tN.y del tN.y #输出结果: setx() getx(): self.__x= 10 delx()
以上がPythonのproperty()デコレータの使い方の詳しい説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。