使用__class__来改变python类,堆错误

时间:2013-09-26 01:18:24

标签: python

我正在尝试创建一个class =从list扩展返回一个片段而不是列表类型。我想这样做的原因是因为我有许多其他方法来操纵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类(当前的类型列表)更改为Alist

当我尝试:

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

因为我可以为自己的对象类型执行此操作,所以非常难过。 我知道它不是标准的,但已经完成了。 Reclassing an instance in Python

有解决方法吗?此外,我显然简化了问题,我的对象有点复杂。我发现的主要是将列表重建为我的Alist版本很慢。而且我需要做很多这样的操作(不可避免)。有没有办法重拍A?或解决方案,以加快速度?

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

1 个答案:

答案 0 :(得分:1)

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