0

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

也就是说,我想写这个:

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 'magic' 函数(例如__str__for print baz),但我想知道是否:

  • 这实际上将涵盖所有可能的用例(有没有办法访问不涉及使用 python 魔术函数的变量的内容)
  • 有一种更通用的方法可以做到这一点
4

1 回答 1

1

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

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

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

  • 自定义类的属性访问可以与__getattr__方法挂钩,或者使用property.
  • 访问类似序列的类(列表、元组、字符串)映射类型的类中的单个项目可以使用__getitem__.

您必须根据您的用例决定需要挂钩的内容,此时您不可避免地需要进行昂贵的计算。Python 将让您轻松地钩住对象生命周期中的几乎任何时间点。

于 2012-10-08T14:09:13.447 回答