Pythonの技法:プロパティによるアクセサの実装
文:Nick Gibson(Builder AU)
翻訳校正:原井彰弘
翻訳校正:原井彰弘
2008/01/07 18:00
メソッドによってクラスの属性をすべて管理することは、設計のガイドラインとして有名である。getterメソッド、setterメソッドと呼ばれることも多いこの手法を用いると、属性の安全性は向上するものの、単純さや簡潔さは犠牲になってしまうことが多い。しかし、Pythonのプロパティを用いると、双方のメリットを享受することが可能になる。
まずは、属性をいくつか持った単純なクラスを書くことから始めてみよう。以下のようなクラスを定義する。
class A(object):
x = 2
y = 3
z = 4
このコードは、予想通り次のように動作するはずだ。
>>> i = A() >>> i.x, i.y, i.z (2, 3, 4) >>> i.x = 0 >>> i.x 0
このクラスを単純なレコードとして使用している限り、これで何も問題はない。しかし、フィールドを一つ読み取り専用にしなければならなくなった場合はどうすればよいだろうか?次のようにgetterとsetterを記述すればよい。
class B(object): y = 3 z = 4 def __init__(self): self.__x = 2 def getx(self): return self.__x def setx(self, val): print "x is read only"
この場合、使い方は次のようになる。
>>> i = B() >>> i.getx(), i.y, i.z (2, 3, 4) >>> i.setx() x is read only >>> i.x Traceback (most recent call last): File "", line 1, in AttributeError: 'B' object has no attribute 'x' >>> dir(i) ['_B__x', '__class__', '__delattr__', '__dict__', '__doc__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__str__', '__weakref__', 'getx', 'y', 'z'] >>> i._B__x = 0 >> i.getx() 0
単に誤って上書きしてしまうことのないようxの値を保護したいだけの場合、この結果は歓迎できるだろう。しかしこの方法では、xの値を探し出して強引に変更することもまだ可能だ。2つのアンダースコアで始まるクラスの属性は、Pythonではクラス名を含む名前に変更されるのである。このしくみによって、一見アクセス不可能だが実は依然としてアクセス可能な「疑似プライベート変数」が定義されるのだ。
また、Bクラスは明らかにインタフェース上の問題を抱えている。xフィールドへのアクセス方法は、ほかのフィールドへのアクセス方法とまったく異なっているのである。getメソッドとsetメソッドを他の2つのフィールドについても定義し、この問題を修正することも可能だが、それよりもよい方法がある。プロパティを使うのだ。
- ホワイトペーパー
- 話題のタグ
iPod touch
Firefox
Mozilla
Chrome
CSS
Apple
仮想化
iPhone
Windows 7
Windows XP
Ajax
PHP
マイクロソフト
ブラウザ
Windows
HTML
Java
データベース
リファレンス
脆弱性
WebKit
ソフトウェア開発
Webデザイン
JavaScript
Off Topic
RIA
Opera
Webサービス
Linux
セキュリティ
アプリケーション
Tips
Google
iPhone 3G
Mac OS X
小技
Firefox 3
OS
Microsoft
インストール
Safari
開発環境
Flash
プログラミング言語
Database
Windows Vista
UI
Internet Explorer
モバイル
オープンソース
話題のタグを見る »
グーグル、JavaScriptプログラミングツールをリリース
Windowsの歴史 Windows Server 2008編:同じカーネルを持つ「Vista」とは対照的に早くから支持を得たサーバOS
Windowsの歴史 Windows Server 2003 R2編:安定性と先進性の両立目指す「R2」の先駆けとなったOS
モジラ、「Firefox 3.6」の第1ベータ版をリリース
【最終警告】パンデミック対策特集
大丈夫?あなたの会社のセキュリティ対策
―エン・ジャパン厳選求人☆毎週更新―
進むストレージ環境の見直し
最大32個のセンサーが電力を徹底管理!
100万円で実現!中小企業の情報漏えい対策
企業ITシステムの企画、構築、運用のイロハ