プラネタリウム ソフトウェアの Python プラグインをコーディングしています。このプラグインには、プラネタリウム ソフトウェアの名前空間内のオブジェクトにアクセスするための関数が付属していますが、面倒で OOP ではありません。したがって、コーディングを合理化するために属性アクセスをオーバーロードするクラスを作成しようとしています。などのことができるようになりたいです。
rocket = RemoteObject('rocket')
rocket.color = blue
プラネタリウム ソフトウェアの名前空間のロケット オブジェクトの色を青に設定します。
でプロパティを定義する方法__init__
は非常に近いです。私が抱えている問題の 1 つは、インスタンスの作成時にプロパティの名前を決定する必要があることです。もう 1 つの問題は、ディスクリプタ全般に対する私の理解不足によるものです。属性呼び出しは、getter と setter を呼び出すのではなく、プロパティ オブジェクト自体を返したり、上書きしたりしています。
これが私がこれまでに持っているものです:
class RemoteObject(object):
def __init__(self,remote_object_name):
self.normalattr = 'foo'
self.normalmethod = lambda: 'spam'
for attrname in get_remote_object_attrnames(remote_object_name):
def _get(self):
return fetch_remote_attr_value(remote_object_name,attrname)
def _set(self,value):
set_remote_attr_value(remote_object_name,attrname,value)
setattr(self,attrname,property(_get,_set))
if __name__ == '__main__':
get_remote_object_attrnames = lambda name: {'apple','banana','cherry'}
fetch_remote_attr_value = lambda o,a: 'Reading %s.%s' % (o,a)
set_remote_attr_value = lambda o,a,v: 'Writing %s.%s = %s' % (o,a,v)
scene = RemoteObject('scene')
for x in scene.__dict__.items(): print x
print '-----'
print scene.normalattr
print scene.normalmethod()
print scene.apple
scene.banana = '42'
print '-----'
for x in scene.__dict__.items(): print x
実行すると、次のように返されます。
('cherry', <property object at 0x00CB65A0>)
('normalmethod', <function <lambda> at 0x00CB8FB0>)
('banana', <property object at 0x00CB65D0>)
('normalattr', 'foo')
('apple', <property object at 0x00CB6600>)
-----
foo
spam
<property object at 0x00CB6600>
-----
('cherry', <property object at 0x00CB65A0>)
('normalmethod', <function <lambda> at 0x00CB8FB0>)
('banana', '42')
('normalattr', 'foo')
('apple', <property object at 0x00CB6600>)
各インスタンスのプロパティを必要とする attrnames の動的セットを処理するより良い方法はありますか? プロパティ名に一致するインスタンス属性が、そのゲッターまたはセッターを実行するのではなく、プロパティ オブジェクト自体を返すのはなぜですか?