2016-06-16 5 views
2

私は、複数の必要なデータとメタデータを持つデータセットを記述するオブジェクトを持っています。異なるデータとメタデータの要素自体は、名前と値の属性を含む多数の異なる属性を持つ同じ型のオブジェクトです。これらのデータ要素とのやりとりのほとんどはvalue属性を使用しているため、.valueを使用して絶えず参照するのは面倒なので、各データ要素のプロパティを定義しようとしていますが、新しいデータ要素は自動的にそれに対して定義されたプロパティを取得します。具体的には、ここではいくつかのサンプルコードは次のとおりです。Pythonでプログラムでプロパティを定義する方法

class my_par(object): 
    def __init__(self, name, value): 
     self.name = name 
     self.value = value 

class my_obj(object):  
    def __init__(self, xval, yval, zval): 
     self.xval = my_par('x', xval) 
     self.yval = my_par('y', yval) 
     self.zval = my_par('z', zval) 

私は

@property 
def x(self): 
    return self.xval.value 

@x.setter 
def x(self, value): 
    self.xval.value = value 

を使用してmy_objクラスのプロパティを作ることができますが、私はすべてのmy_par型オブジェクト上のプログラムでそれを行うための方法をしたいです。 (私はすでにそれらのオブジェクトのイテレータを持っているので、プログラムでプロパティを定義するコードが必要です)。

+1

一つ関連して、非常に有名なSOページを試してみては、[動的にPythonのクラスにプロパティを追加する方法は?]である(http://stackoverflow.com/questions/1325673/how-to-add -property-to-a-python-class-dynamic)と@AlexMartelliからの興味深い答えを持つ別のものは[動的に\ @propertyをpythonに追加]です(http://stackoverflow.com/questions/2954331/dynamically-adding-property -in-python)を実行します。 – Dilettant

+1

私はこれらのページを見つけようとしましたが、助けてくれましたが、私が望んでいたもの、つまり__init__のプロパティをすべてのインスタンスに存在するように定義していませんでした。 –

答えて

0

:このように使われていますSETATTRでself.__class__の特定の使用で

class my_par(object): 
    def __init__(self, name, value): 
     self.name = name 
     self.value = value 

class my_obj(object):  
    def __init__(self, xval, yval, zval): 
     self.xval = my_par('x', xval) 
     self.yval = my_par('y', yval) 
     self.zval = my_par('z', zval) 

     par_list = ['xval', 'yval','zval'] 

     for p in par_list: 
      this_par = getattr(self, p) 
      attr_name = this_par.name 
      setattr(self.__class__, attr_name, property(self.prop_fget(p), self.prop_fset(p))) 


    def prop_fget(self, attr_name): 
     def fget(self): 
      this_par = getattr(self, attr_name) 
      return this_par.value 
     return fget 


    def prop_fset(self, attr_name): 
     def fset(self, value): 
      this_par = getattr(self, attr_name) 
      this_par.value = value 
      setattr(self, attr_name, this_par) 
     return fset  

ノートにプロパティを取り付けるためにインスタンスではなくクラス。

+0

codereview.stackexchange.comでそれを投稿して、誰かがあなたをきつく締め付けるのを助けることができるかどうか確認することができます。 – rrauenza

0

pythonには、オブジェクトのプロパティを取得および設定できる関数getattrおよびsetattrがあります。これはやった、動作しませんでしたたくさんのことを試した後

setattr(obj, "prop", value) # set the value 
getattr(obj, "prop") # get the value 
0

namedtuple

from collections import namedtuple 

my_par = namedtuple('par', 'name value') 
par = my_par('par_name', 'par_value') 
print(par[0]) #outputs: par_name 
print(par.value) #outputs: par_value 
name, value = par 
print(name,value) #outputs: par_name par_value 
関連する問題