python - 在模块加载时设置类的属性

时间:2012-11-29 05:20:54

标签: python properties

我正在处理一个处理python上dict数据的代码。  在实现这样的类时,我必须定义很多属性。这并不难,但最近我认为如果我可以使用辅助功能这样的话会好得多。

例如,我们假设我有一个如下的类。

class MyClass(object):

    def __init__(self, data):
        self.data = data

    @property
    def version(self):
        return self.data["version"]

如果我能用以下内容写这个课。

 class MyClass(object):

     def __init__(self, data):
         self.data = data

     define_own_property("data", "version")

看起来微不足道,但如果我能做到这一点,我想我可以重复使用很多验证/异常处理案例。

有什么想法吗? :d

2 个答案:

答案 0 :(得分:3)

只需编写一个函数来返回所需的访问器,就可以实现类似的功能:

def define_own_property(attr, key):
    def prop(self):
        return getattr(self, attr)[key]
    return property(prop)

class MyClass(object):
    def __init__(self, data):
        self.data = data

    version = define_own_property("data", "version")

请注意,您必须执行version = ...无法进行简单的函数调用define_own_property向正在定义的类添加属性,因为该类尚不存在,因此您不能参考它。

另一种可能性是给你的类一个属性,它是一个列表或字典或含有相关参数的东西(“数据”,“版本”等),然后编写一个读取这些参数并自动创建的类装饰器一系列的属性。这样就不需要在类中定义属性了;你只需要列出你想让属性访问的东西,然后在课堂上使用装饰器一次。

答案 1 :(得分:2)

好像你可以使用描述符:

class Descr(object):
    def __init__(self,attr,key):
        self.attr = attr
        self.key = key

    def __get__(self,obj,type=None):
        return getattr(obj,self.attr)[self.key]

    def __set__(self,obj,value):
        getattr(obj,self.attr)[self.key] = value

    def __delete__(self,obj):
        del getattr(obj,self.attr)[self.key]

class MyClass(object):
    def __init__(self, data):
        self.data = data

    version = Descr("data","version")
    foobar = Descr("data","foobar")

a = MyClass({})
a.version = 1
print a.version
a.foobar = 'string'
print a.data