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を使うツールが多いせいか命名規則が揃っていて気持ちがいいんですよね(*´ω`*)
色々できる反面、逆にどうするのがベストなんだろう?っと迷ってしまいますね(;´∀`)