Python3 – property – getter/setter

一般的な書き方

クラス定義でgetter/setterなどのアクセサを一般的に書くと次のようになる。

Pythonでは、メンバ変数(インスタンス変数)はパブリックアクセスが可能だが、メンバ変数への代入や参照を行った際に、裏でセッターやゲッターを呼び出すようにすることができる。また同じ手順で、インスタンスのdelete時の処理もプロパティとして登録できる。

このように見かけ上の参照・代入・削除処理から各アクセサを呼び出すために、Pythonでは組み込み関数のproperty()を使う方法と、@マークに続けたデコレータを使う方法がある。

property()関数

property関数を使うことで、getterなどをプロパティとして登録できる。次の例では、インスタンス変数_xに関するgetter、setter、deleterをxという名前のプロパティとして登録している。

property()関数の引数は以下の通り。

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

  • fget getterのメソッド名
  • fset setterのメソッド名
  • fdel deleterのメソッド名
  • doc プロパティの説明文(ドキュメント文字列)

propertyデコレータ

使い方

以下のように@マークに続けて書くデコレータでアクセサを定義できる。ただし以下の点に注意。

  • デコレータの最初は、@property
  • @propertyで定義できるのはgetterのみ

つまり、必ず最初に@propertyで、かつgetterを定義しなければならない。

@propertyは最初でなければならない

たとえば次のように@propertyがsetterよりも後にあると、”setterでxが定義されていませんよ”と怒られる。

@propertyはgetterしか定義できない

また@propertyでsetterを定義し、@*.getterでgetterを定義しようとすると、getterは実行されてsetterの方で”引数をセットできない”とエラーになる。

@propertyでダミーのアクセサを定義する方法

@propertyでダミーのアクセサを定義して、その後にgetterのデコレータで定義をするのは通る。

property()でドキュメント文字列だけを定義する方法

また、property()関数でメンバ変数のドキュメント文字列だけを定義したのちに、getter/setter/deleterのデコレータでそれぞれのメソッドを定義する方法もあるらしい。

 

 

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です