propertyデコレータを使う方法!!




takkun
どうも!たっくんです。

Pythonでクラスを作っていると、自分で定義したオブジェクトにオブジェクトの状態に触るための機能(状態の取得、状態の設定、状態の削除)を作りたくなりますよね!

かっこよく言うと・・・

アクセサ

色々ある方法の中で、今回はデコレータを使う方法をご紹介したいと思います!(`・ω・´)ゞ

クラスの用意

クラス「Node」に、名前を保持するためのインスタンス変数が1つ用意します。この名前を保持するためのインスタンス変数は、直接アクセスしてほしくないものになります。

class Node(object):
	def __init__(self, name):
		self.__name = name

@propertyを付けてgetterの作成

名前を取得できるようにするに、「@property」を付けたメソッド「name」を定義します!このメソッドは、インスタンス変数「__name」を返すようにします!

class Node(object):
	def __init__(self, name):
		self.__name = name

	@property
	def name(self):
		return self.__name

すると、以下のように名前を取得することができます!

node = Node('pSphere1')
print node.name
# pSphere1

@プロパティ名.setterを付けてsetterの作成

続いて、作成したプロパティ「name」に値を設定できるようにします。メソッド名をあわせてデコレーターを「@プロパティ名.setter」を付けます!∠( ゚д゚)/

class Node(object):
	def __init__(self, name):
		self.__name = name

	@property
	def name(self):
		return self.__name

	@name.setter
	def name(self, name):
		self.__name = name

すると、以下のようにインスタンス変数「__name」の値を書き換えることができます!

node = Node('pSphere')
node.name = 'pCube'
print node.name
# pCube

@プロパティ名.deleterを付けて、deleterの作成

作成したプロパティ「name」を削除できるようにしてみます。でも、余り使わない・・・かな?!(;´∀`)

メソッド名をあわせてデコレーターを「@プロパティ名.deleter」を付けます!∠( ゚д゚)/

class Node(object):
	def __init__(self, name):
		self.__name = name

	@property
	def name(self):
		return self.__name

	@name.setter
	def name(self, name):
		self.__name = name

	@name.deleter
	def name(self):
		del self.__name

すると、以下のようにインスタンス変数「__name」を削除することが出来ます!

node = Node('pSphere')
del node.name

当然といえば当然ですが、インスタンス変数を削除してしまっているので、getterを呼び出すとエラーしてしまいます。

node = Node('pSphere')
del node.name
print node.name
# AttributeError: 'Node' object has no attribute '_Node__name' # 

最後に

Qt風に、、、

name = node.name()
node.setName('Name')

今回の様に、、、

name = node.name
node.name = 'Name'

わかりやすく、、、

name = node.getName()
node.setName('Name')

といろいろタイプがありますが、僕ななんとなくQt風に作ることが多いです!っというのも、Qtを使うツールが多いせいか命名規則が揃っていて気持ちがいいんですよね(*´ω`*)

色々できる反面、逆にどうするのがベストなんだろう?っと迷ってしまいますね(;´∀`)