繁体   English   中英

Python属性setter / getter引用

[英]Python property setter/getter reference

我有一个类,我必须在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)

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

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

如果希望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

只需使用lambda:

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

只需使用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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM