Python属性setter / getter引用

时间:2013-12-01 11:45:44

标签: python

我有一个课,我必须在 iter 函数中返回一个回调函数。 使用属性和获取_...样式很容易:

class Test(object):
    def __init__(self):
        self.attrib = 'bla'

    def get_attrib(self):
        return self.attrib

    def __iter__(self):
        yield ('attrib',self.get_attrib)

    def __str__(self):
        ret = ''
        for one in self:
            ret += '%s: %s\n'%(one[0],one[1]())
        return ret

print(Test())

我想更加pythonic并使用属性。但是我怎么能对性能的吸气者做同样的事情呢?因为这不起作用:

class Test(object):
    def __init__(self):
        self._prop = 'bla'

    @property
    def prop(self):
        return self._prop

    def __iter__(self):
        yield ('prop',self.prop.__get__)

    def __str__(self):
        ret = ''
        for one in self:
            ret += '%s: %s\n'%(one[0],one[1]())
        return ret

print(Test())

我发现了以下内容,但是当我调用它时,它需要将对象本身作为参数:

def __iter__(self):
        yield ('prop',self.__class__.prop.__get__)

a = Test()
for one in a:
    print '%s: %s'%(one[0],one[1](a)

UPDATE :我也需要设置器,但我想让这个例子足够简单。所以最后我希望有类似的东西:

def __iter__(self):
            yield ('prop',self.prop.__get__,self.prop.__set__)

3 个答案:

答案 0 :(得分:1)

如果您希望getter和setter可以作为属性调用和访问,则可以执行以下操作

class Test(object):
    def __init__(self):
        self._prop = 'bla'

    def get_prop(self):
        return self._prop

    def set_prop(self, val):
        self._prop = val

    prop = property(get_prop, set_prop)

    def __iter__(self):
        yield ('prop',self.get_prop, self.set_prop)

您现在可以使用

test = Test()
test.prop = 'foo'
print(test.prop)

for a in prop:
    name, getter, setter = a

答案 1 :(得分:1)

只需使用lambda:

    yield ('prop',lambda: self.prop)

答案 2 :(得分:0)

只需使用self.prop并从迭代中移除()调用即可。此处self.prop将返回字符串('bla')本身,并且您尝试在该字符串上调用__get__,这会导致错误,因为字符串没有任何__get__属性:

def __iter__(self):
    yield ('prop', self.prop)

def __str__(self):
    ret = ''
    for one in self:
        ret += '%s: %s\n' % (one[0],one[1]) #remove () call from here

此处self.prop相当于:

Test.prop.__get__(a)

更新:如果您想将其作为一项功能使用,请不要使用@property

def prop(self):
    return self._prop

def __iter__(self):
    yield ('prop', self.prop)