ホームページ  >  記事  >  バックエンド開発  >  Pythonのproperty()デコレータの使い方の詳しい説明

Pythonのproperty()デコレータの使い方の詳しい説明

巴扎黑
巴扎黑オリジナル
2017-08-16 13:44:271641ブラウズ

1. デコレータとは何ですか?

公式の定義: デコレーターは非常に有名なデザイン パターンであり、横断的な要件を持つシナリオでよく使用されます。より古典的なものには、ログ挿入、パフォーマンス テスト、トランザクション処理などが含まれます。デコレータは、この種の問題を解決するための優れた設計です。デコレータを使用すると、関数自体とは関係のない多数の関数で同じコードを抽出し、それを再利用し続けることができます。一言で言えば、デコレーターの目的は、既存のオブジェクトに機能を追加することです。

Python には、合計 3 つの組み込みデコレータが含まれています:

① staticmethod

② classmethod

③ property

2. プロパティ関数 property() 簡単な説明

2.1 プロパティを使用する理由

通常、属性にアクセスして値を割り当てる場合、クラスとインスタンス __dict__; を扱いますが、属性アクセスを標準化したい場合は、①データ記述子、②属性関数の 2 つの方法があります。

ただし、記述子は比較的複雑で初心者にとっては使用が難しいことがわかっているため、記述子の大規模なプロセスと比較すると、property() を試してみるとよいでしょう。

2.2 関数プロトタイプ:

property(fget=None, fset=None, fdel=None, doc=None)

2.3 Normal メソッド定義:

次のように、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: &#39;Normal&#39; object has no attribute &#39;__count&#39;

なぜエラーが報告されたのですか?インスタンス 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(&#39;getx(): self.__x=&#39;, self.__x)
        return self.__x
    def setx(self, value):
        self.__x = value
        print(&#39;setx()&#39;)
    def delx(self):
        print(&#39;delx()&#39;)
        del self.__x
    y = property(getx, setx, delx, "I&#39;m a property")
tN=Normal()
tN.y=10
tN.y
del tN.y
#输出结果:
setx()
getx(): self.__x= 10
delx()

出力は方法1と同じです。これら 2 つの All メソッドが実行可能であることが証明されています (注: 最初のメソッドは @property である必要があります (getter を置き換えます。そうしないとエラーが報告されます))。

以上がPythonのproperty()デコレータの使い方の詳しい説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。