懒洋洋地提供字符串的值

时间:2012-10-08 14:07:47

标签: python lazy-evaluation

我有一个python对象,从概念上允许通过迭代器和getter访问一个充满字符串的数组。但是,由于计算数组中每个元素的确切值非常昂贵,我正在研究为数组中每个插槽的内容返回一个代理对象,然后在实际需要时实时计算实际值。 / p>

即,我想写一下:

bar = foo.get(10) # just returns a proxy
baz = bar # increase proxy reference
l = [baz] # actually increase proxy reference again.
print baz # ooh, actually need the value. Calculate it only the fly.
v = '%s' % bar # I need the value here again
if bar is None: # I need the value here again
    print 'x'
if bar: # I need the value here again
    print 'x'
for i in bar: # I need the value here again
    print i

在C ++中,我会尝试重新引用解除引用操作符......任何想法?

我理解,对于每种情况,我都可以重载特定的python'魔术'函数(例如__str__的{​​{1}}),但我想知道是否:

  • 这实际上将覆盖所有可能的用例(有没有办法访问不涉及使用python魔术函数的变量的内容)
  • 有一种更通用的方法来执行此操作

1 个答案:

答案 0 :(得分:1)

在python中,你将返回一个自定义类型,并覆盖__str__()方法以计算打印时的字符串表示。

class MyCustomType(object):
    def __str__(self):
        return "My string is really costly to produce"

根据您的用例,您仍在查看python提供的各种钩子:

  • 自定义类的属性访问可以使用__getattr__方法或使用property进行连接。
  • 访问类似序列的类(列表,元组,字符串)中的单个项映射类型类可以与__getitem__连接。

根据您的使用案例,您必须根据需要决定 ,这时您需要进行昂贵的计算。 Python将让您轻松地在对象的生命周期内连接任何点。