以编程方式在类初始化

时间:2015-07-24 09:42:02

标签: python-2.7 properties

我想要一个应该在初始化时获取属性名列表的类,而不是创建这些属性。所有属性都应使用相同的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'>

我做错了什么?

1 个答案:

答案 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
相关问题