我有一个课,我必须在 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__)
答案 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)