如何以编程方式定义python中的属性

时间:2016-06-16 20:45:22

标签: python

我有一个对象描述了一个包含多个必需数据和元数据的数据集。不同的数据和元数据元素本身是具有许多不同属性的相同类型的对象,包括名称和值属性。与这些数据元素的大多数交互都是使用value属性,并且使用.value不断引用它变得很烦人,所以我试图为每个数据元素定义一个属性,但我想以编程方式进行,所以当我添加一个新的数据元素,它自动获取为其定义的属性。具体来说,这是一些示例代码:

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)

我可以使用

在my_obj类上创建属性
@property
def x(self):
    return self.xval.value

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

但我想要一种方法在所有my_par类型对象上以编程方式执行。 (我已经有了这些对象的迭代器,所以我需要的是以编程方式定义属性的代码。)

3 个答案:

答案 0 :(得分:0)

在python中,有函数getattrsetattr可以获取和设置对象的属性。它的使用方式如下:

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

答案 1 :(得分:0)

在尝试了许多不起作用的事情后,这样做了:

{{ devel_dump() }}

特别注意在setattr中使用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 以便将属性附加到类而不是实例。

答案 2 :(得分:0)

尝试namedtuple

 function addTextToBoard(el, val) {
       var wordArray = val.split('');
       for(i = 0; i < wordArray.length; i++) {
          (function(index) {
            var letter = document.createElement('span');
             letter.innerHTML = wordArray[i];
            setTimeout(function(){
             el.appendChild(letter);
            },1000);
        })(i);
        }
    }