Skip to main content
 首页 » 编程设计

python之使用 __class__ 更改 python 类,堆错误

2025年05月04日13dudu

我正在尝试使从列表扩展的类 = 返回其自身的一部分而不是列表类型。我想这样做的原因是因为我有许多其他方法来操作 A 的实例。
我正在运行 python 2.7.3 假设我有:

class B(): 
def __init__(self, t, p): 
    self.t = t 
    self.p = p 
 
class Alist(list): 
    def __init__(self, a_list_of_times = []): 
        for a_time in a_list_of_times: 
            self.append(a_time ) 
    def __getslice__(self, i, j): 
        return super(Alist, self).__getslice__(i,j) 
 
    def plot_me(self): 
        pass 
        # other code goes here! 
 
 
alist1 = Alist() 
for i in range(0, 1000000): 
    alist1.append(B(i, i))                  # yes ten million, very large list! 
alist = alist1[1000:200000]                 # will return a list! 
alist2 = Alist(alist)                # will return Alist istance  

问题是重新制作整个列表,如在制作变量 b 时看到的那样非常非常慢(与切片相比)。我想做的只是将 alist 的类(当前类型为 list)更改为 Alist

当我尝试时:

alist.__class__ = Alist 
>>>> TypeError: __class__ assignment: only for heap types. 

这很可悲,因为我可以为我自己的对象类型执行此操作。 我知道这不是标准的,但是已经完成了。 Reclassing an instance in Python .

有解决办法吗?我也明显简化了问题,我的对象有点复杂。我发现的主要是将列表重新制作成我的 Alist 版本很慢。而且我需要经常做这个操作(不可避免)。有没有办法重制A?或解决此问题以使其加速的方法?

在我的版本中,我可以在 0.07 秒内完成大约 10,000(我的切片大小)切片,并将其转换为我的 Alist 版本需要 3 秒。

请您参考如下方法:

UserList 类(在 Python 3 中移至 collections)是为此而设计的。从所有其他方面来看,它都是一个 list,但具有 data 属性,您可以在其中存储底层 list 而无需复制。

from UserList import UserList 
 
class Alist(UserList): 
    def __init__(self, iterable, copy=True): 
        if copy: 
            super(Alist, self).__init__(iterable) 
 
        else: 
            self.data = iterable 
 
    def plot_me(self): 
        pass