用户字符串子类,'str' 对象不可调用



我有点拘泥于这段代码,它应该创建一个类似字符串的对象,在使用时,它将返回内部lambda的值。我使用集合。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:patha.py", line 14, in <module>
    print(a.lower())
  File "C:Python35libcollections__init__.py", line 1082, in __str__
    def __str__(self): return str(self.data)
  File "C:patha.py", line 10, in __getattribute__
    self.data = self.func()
TypeError: 'str' object is not callable

Python版本:3.4、3.5。

好吧,我想明白了。似乎在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")

效果很好。

最新更新