我想要一个应该在初始化时获取属性名列表的类,而不是创建这些属性。所有属性都应使用相同的getter和setter方法(例如,用于验证)。
我已经尝试过以下操作,但它无法按预期工作:
class Foo(object):
def __init__(self,props):
for prop in props:
setattr(self,prop, property(self.get,self.set))
def get(self,*args):
# somehow get the value
return 'get: ' + ','.join(args)
def set(self,*args):
# somehow save the value
return 'set: ' + ','.join(args)
f = Foo(['foo_test'])
print f.foo_test
# output: <property object at 0x028650C0>
print type(f.foo_test)
# output: <type 'property'>
f.foo_test = 5
# no output
print type(f.foo_test)
# output: <type 'int'>
我做错了什么?
答案 0 :(得分:0)
我做到了。之前我不知道的是你必须在类 -level上使用property() - 函数,而不是在实例级上。这是我的代码:
def get(obj, attr):
print 'get: ' + ','.join(map(str,[obj, attr]))
return getattr(obj,'__' + attr)
def set(obj, attr, val):
print 'set: ' + ','.join(map(str,[obj, attr, val]))
setattr(obj,'__' + attr,val)
class Foo(object):
def __init__(self,attrs=None):
for attr in attrs:
setattr(self.__class__,'__' + attr, None)
prop = property(lambda obj,attr=attr: get(obj,attr),
lambda obj,val,attr=attr: set(obj,attr,val))
setattr(self.__class__,attr, prop)
class Bar(Foo):
def __init__(self):
Foo.__init__(self,['bar_test1','bar_test2'])
b = Bar()
print b.bar_test1
# output:
# get: <__main__.Bar object at 0x02859310>,bar_test1
# None
b.bar_test1 = 5
# output:
# set: <__main__.Bar object at 0x02859310>,bar_test1,5
print b.bar_test1
# output:
# get: <__main__.Bar object at 0x02859310>,bar_test1
# 5
print b.bar_test2
# output:
# get: <__main__.Bar object at 0x02859310>,bar_test2
# None