【问题标题】:How to programmatically define properties in python如何以编程方式在python中定义属性
【发布时间】:2016-06-16 20:45:21
【问题描述】:

我有一个对象,它描述了一个包含多个所需数据和元数据的数据集。不同的数据和元数据元素本身是相同类型的对象,具有许多不同的属性,包括名称和值属性。与这些数据元素的大多数交互都是与 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 类型对象执行此操作的方法。 (我已经对这些对象有一个迭代器,所以我需要的只是以编程方式定义属性的代码)。

【问题讨论】:

标签: python


【解决方案1】:

在python中,有函数getattrsetattr可以获取和设置对象的属性。它是这样使用的:

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

【讨论】:

    【解决方案2】:

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

    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    
    

    特别注意在 setattr 中使用 self.__class__ 以便将属性附加到类而不是实例。

    【讨论】:

    • 您可以将其发布在 codereview.stackexchange.com 上,看看是否有人可以帮助您收紧它。
    【解决方案3】:

    试试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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-22
      • 1970-01-01
      相关资源
      最近更新 更多