我有点坚持这个代码,它应该创建一个类似字符串的对象,在使用时,将返回内部lambda的值。我使用collections.UserString。
from collections import UserString
class instrx(UserString):
func = None
data = ''
def __init__(self,func):
self.func = func
def __getattribute__(self,name):
print("get",name)
if name=='data':
self.data = self.func()
return UserString.__getattribute__(self,name)
a = instrx(lambda: 'aa')
print(a,type(a))
print(a.lower())
运行此代码就是这样:
Traceback (most recent call last):
File "C:\path\a.py", line 14, in <module>
print(a.lower())
File "C:\Python35\lib\collections\__init__.py", line 1082, in __str__
def __str__(self): return str(self.data)
File "C:\path\a.py", line 10, in __getattribute__
self.data = self.func()
TypeError: 'str' object is not callable
Python版本:3.4,3.5。
答案 0 :(得分:2)
好的,我想出来了。
似乎在UserString中的某些函数中(如示例中的.lower()
)self.__class__(self.data)
构造被使用。我做了一点解决方法:
import time
from collections import UserString
class instrx(UserString):
func = None
data = ''
def __init__(self,data,func=None):
self.data = data
if func==None:
self.func = lambda: UserString.__getattribute__(self,'data')
else:
self.func = func
def __getattribute__(self,name):
if name=='data':
self.data = str(self.func())
return UserString.__getattribute__(self,name)
a = instrx('',func=lambda: time.time())
print(a,type(a))
print(a.lower())
print(a+"test")
工作得很好。