あなたがおそらく本当に意図していることのためのラグニュアージュの1つの規定は __setattr__
、クラスのメソッドを書くことです。
このメソッドは、通常は存在しない属性がインスタンスでアクセスされるたびに調整されます。
>>> class Test(object):
... a = 0
... def __getattr__(self, attr):
... return attr
...
>>> t = Test()
>>> t.a
0
>>> t.b
'b'
>>> t.c
'c'
あなたが直接求めていることも可能ですが、しかし、いくつかのハックが必要です-常識的にはお勧めできませんが、野生の生産で広く使用されています。つまり、プロパティがPythonに存在するためには、それは特別なタイプのオブジェクト(少なくとも__get__
メソッドを持つオブジェクト)にバインドされたクラス属性です。(Pythonドキュメントの「記述子プロトコル」の詳細を確認してください)。
ここで、例で貼り付けたコードのように、一度に複数のプロパティを作成しようとすると、呼び出された関数からクラスの名前空間にプロパティ名を挿入する必要があります。それは_可能_であり、Pythonの本番環境でも使用されており、実現するのは難しくありません。しかし、それにもかかわらず、きれいではありません。
したがって、これを回避するための可能な方法は、一連の「プロパティ」オブジェクトを返す呼び出しを行うことです。これは、クリーンで、読み取り可能で、保守可能です。
class MultiProperty(object):
def __init__(self, getter, setter, name):
self.getter = getter
self.setter = setter
self.name = name
def __get__(self, instance, owner):
return self.getter(instance, self.name)
def __set__(self, instance, value):
return self.setter(instance, self.name, value)
def multi_property(mgetter, msetter, *args):
props = []
for name in args:
props.append(MultiProperty(mgetter, msetter, name))
return props
class Test(object):
def multi_getter(self, attr_name):
# isf desired, isnert some logic here
return getattr(self, "_" + attr_name)
def multi_setter(self, attr_name, value):
# insert some logic here
return setattr(self, "_" + attr_name, value)
a,b,c = multi_property(multi_getter, multi_setter, *"a b c".split())