2

我正在编写处理 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

4

2 回答 2

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向正在定义的类添加属性,因为该类尚不存在,因此您无法引用它。

另一种可能性是给你的类一个属性,它是一个列表或字典或包含相关参数(“数据”、“版本”等)的东西,然后编写一个类装饰器来读取这些参数并自动创建一系列特性。这将完全消除在类内部定义属性的需要;您只需列出您希望属性访问的内容,并在类上使用一次装饰器。

于 2012-11-29T05:31:39.293 回答
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
于 2012-11-29T05:30:22.727 回答