[英]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.