我发现从str
派生并重写{}可以覆盖字符串。你知道有什么魔法可以创建一个延迟初始化的字符串吗?
因此
def f(a, b):
print("f called")
return a+b
s=f("a", "b")
print("Starting")
print(s)
我如何向函数f
添加一个decorator,使这个函数只在打印“Starting”之后执行(基本上是在第一次访问时)?似乎很棘手。。。:)
我可以在返回对象时这样做,因为在那里我拦截属性访问。但是,字符串不使用属性访问?在
Tags:
尝试使用来自stringlike的
LazyString
类,如下所示做你想做的事也许有更简单的方法 然而,我曾经为泛型函数编写了一个泛型的“lazy decorator”,它完全可以满足您的要求,因为它几乎适用于函数返回的任何类型的对象。在
基本思想是:对于给定的退出对象,Python实际上并不“使用”其值,而是调用对象类中的“dunder”(magic double“uuu”)方法之一- 它可以用来表示它(调用
__repr__ __str__ __unicode__
),从中获取属性,进行调用,在算术运算中使用它作为运算符等等。在因此,这个decorator在函数被调用时,基本上存储参数并等待调用这些神奇的方法中的任何一个,然后它进行originall调用并缓存返回值-
soruce代码在这里:
https://bitbucket.org/jsbueno/metapython/src/f48d6bd388fd/lazy_decorator.py
您要查找的属性是}。在
__str__()
、__repr__()
和{相关问题 更多 >
编程相关推荐