我正在处理一个处理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
答案 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