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つのフィールドについても定義し、この問題を修正することも可能だが、それよりもよい方法がある。プロパティを使うのだ。
- 今日のトップ記事
- 昨日
- 5日前
- 6日前
- 7日前
- ホワイトペーパー
- 話題のタグ
Off Topic
Safari
オープンソース
プログラミング言語
Chrome
Microsoft
開発環境
アプリケーション
データベース
Firefox 3
Webデザイン
Tips
iPhone
RIA
マイクロソフト
脆弱性
Apple
Internet Explorer
ブラウザ
リファレンス
小技
インストール
Ajax
WebKit
iPhone 3G
クラウド
UI
Windows 7
Mozilla
Opera
仮想化
Java
Windows
セキュリティ
iPod touch
Windows Vista
Firefox
Windows XP
Flash
Mac OS X
Database
モバイル
ソフトウェア開発
HTML
CSS
Webサービス
JavaScript
OS
Linux
Google
話題のタグを見る »
「Google Chrome」の拡張機能、開発者からのアップロード受付を開始
IMAPでGmailを受信、最も手っ取り早いのは?Windows 7、Ubuntu 9.10、Snow Leopardのメーラー比較
Snow LeopardではNTFSをサポート--その源流を訪ねる(2)
MS運営のオープンソース開発プロジェクト支援サイト「CodePlex」を探検する(2)
Snow LeopardではNTFSをサポート--その源流を訪ねる(1)
フォトレポート:「Windows Server 2008 R2」--あまり知られていない有用な機能10選
大丈夫?あなたの会社のセキュリティ対策
企業ITシステムの企画、構築、運用のイロハ
―エン・ジャパン厳選求人☆毎週更新―
電力に"ふた"をする独自の省エネ機能とは!?
【最終警告】パンデミック対策特集
100万円で実現!中小企業の情報漏えい対策
高まるiSCSIストレージへの注目度