UserString子类,'str'对象不可调用

时间:2015-10-31 17:39:27

标签: python python-3.x collections

我有点坚持这个代码,它应该创建一个类似字符串的对象,在使用时,将返回内部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。

1 个答案:

答案 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")

工作得很好。