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

标签 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。

最佳答案

好的,我想通了。 似乎在 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")

工作得很好。

关于python - UserString 子类, 'str' 对象不可调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33454580/

相关文章:

python - 从 python 重定向标准输出以进行 C 调用

python - 如何从异步函数返回值

java - 如何更改子类中变量的实现?

java - java中内存使用量最小的Native Collection

java - 交换方法中变量 i 减 1 的目的是什么? - 1 真的是公平随机化所必需的吗?

python - 获取 Django 中每个页面用户类型的值

python - 使用 sudo 运行 Django 找不到已安装的 Homebrew 程序包

python - NMAP 服务信息

python - 使用for循环定义多个函数——Python

python - 打印行的最短代码以 ['a' , 'b' ] 和以 ['y' , 'z' ] 结束 Python 3