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つのフィールドについても定義し、この問題を修正することも可能だが、それよりもよい方法がある。プロパティを使うのだ。
- ホワイトペーパー
- 企画特集
仮想環境を実現するソリューション特集
【徹底対談】運用管理ツールの賢い使い方
ESBでIT投資の無駄を劇的に解消する
そのストレージで仮想化に対応できますか?
SOA、BPM、SaaS −今、企業に必要なこと
ストレージメディア特設サイト開設
セキュリティ&ユーザ事例【SIer Club】
御社のログ活用しませんか!?
◆エン・ジャパン厳選求人☆毎週更新◆
インターネット上の悪意を未然に防ぐには?
パンデミック対策特集
集積度も性能も、業界最高水準のブレードPC
中小企業のセキュリティリスクとは?
今注目の「サジェスト検索」−デモ掲載中
ロリポップ!がリニューアル
- サーバー監視・運用のコストを削減するには
- エンタープライズにおけるSUSEの強み
- サービス・ドリヴン・データセンター
- ■ストレージ容量50%削減保証■
- 話題のタグ
開発環境
セキュリティ
仮想化
アプリケーション
SOA
Firefox 3
Safari
オープンソース
リファレンス
モバイル
Windows Vista
Windows 7
Java
Database
Tips
Internet Explorer
Firefox
Webサービス
iPhone 3G
Webデザイン
プログラミング言語
iPhone
ソフトウェア開発
Opera
UI
脆弱性
データベース
Chrome
Linux
ブラウザ
RIA
Windows
Off Topic
Google
ツール
WebKit
PHP
小技
Adobe
Mac OS X
JavaScript
OS
Apple
Flash
iPod touch
Microsoft
CSS
HTML
Ajax
Mozilla
話題のタグを見る »
Windows 7はLinuxへの切替が簡単:注目の仮想ディスクフォーマット「VHD」
iPhone OS 3.0で変わった「絵文字」
OSSのクラウド基盤「Eucalyptus」を使う(4)--インストール〜ノード構築
俳優経験者が指南する「人前で上手く話すためのティップス10選」
「うるまでるびペイント」登場:絵は上手下手ではなく制作過程に楽しみが
待てば回路の日和あり--「iPhone 3GS」発売、しかし――