Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 是否有一种简单的方法覆盖列表对象';s方法\uuuu获取项目\uuuuu?_Python_List_Subclass - Fatal编程技术网

Python 是否有一种简单的方法覆盖列表对象';s方法\uuuu获取项目\uuuuu?

Python 是否有一种简单的方法覆盖列表对象';s方法\uuuu获取项目\uuuuu?,python,list,subclass,Python,List,Subclass,我正在尝试定义默认样式列表对象: class ilist(list): def __init__(self,r=list(),dft=None): list.__init__(self,r) self.dft=dft def __getitem__(self,n): if len(self)<=n: for i in range(n-len(self)+1): self.

我正在尝试定义默认样式列表对象:

class ilist(list):
    def __init__(self,r=list(),dft=None):
        list.__init__(self,r)
        self.dft=dft
    def __getitem__(self,n):
        if len(self)<=n:
            for i in range(n-len(self)+1):
                self.append(self.dft)
        for i,v in enumerate(self):
            if i+1==len(self):
                return v

x=ilist()
print x[4]
print x
但我觉得质疑我的ilist很可怕。 我尝试了以下方法:

def __getitem__(self,n):
    from operator import getitem
    if len(self)<=n:
        for i in range(n-len(self)+1):
            self.append(self.dft)
    return getitem(self,n)
def\uuu获取项目(self,n):
从操作员导入getitem
如果len(self)使用
super()
访问原始
\uuu getitem\uuu

def __getitem__(self,n):
    while len(self) <= n:
        self.append(self.dft)
    return super(ilist, self).__getitem__(n)
但是,您可以将默认值创建移到助手方法:

class ilist(list):
    def __init__(self, r=None, dft=None):
        if r is None:
            r = []
        list.__init__(self, r)
        self.dft=dft

    def _ensure_length(n):
        maxindex = n
        if isinstance(maxindex, slice):
            maxindex = maxindex.indices(len(self))[1]
        while len(self) <= maxindex:
            self.append(self.dft)

    def __getitem__(self, n):
        self._ensure_length(n)
        return super(ilist, self).__getitem__(n)

    def __setitem__(self, n, val):
        self._ensure_length(n)
        return super(ilist, self).__getitem__(n)
类ilist(列表):
定义初始化(self,r=None,dft=None):
如果r为无:
r=[]
列表。初始化(self,r)
self.dft=dft
定义长度(n):
maxindex=n
如果isinstance(最大索引,切片):
maxindex=maxindex.index(len(self))[1]

虽然len(self)在添加必要数量的元素后,您只需调用原始(重写的)
\uuu getitem\uuu
方法,如下所示

class ilist(list):
    def __init__(self,r=list(),dft=None):
        list.__init__(self,r)
        self.dft=dft
    def __getitem__(self,n):
        if len(self)<=n:
            for i in range(n-len(self)+1):
                self.append(self.dft)
        return super(ilist, self).__getitem__(n)

x=ilist()
print x[4]
print x
类ilist(列表):
def uuu init uuuu(self,r=list(),dft=None):
列表。初始化(self,r)
self.dft=dft
定义获取项目(自身,n):

如果len(self)Martijn的答案已准备好使用且没有错误:

class ilist(list):
    def __init__(self, r=None, dft=None):
        if r is None:
            r = []
        list.__init__(self, r)
        self.dft = dft

    def _ensure_length(self, n):
        maxindex = n
        if isinstance(maxindex, slice):
            maxindex = maxindex.indices(len(self))[1]
        while len(self) <= maxindex:
            self.append(self.dft)

    def __getitem__(self, n):
        self._ensure_length(n)
        return super(ilist, self).__getitem__(n)

    def __setitem__(self, n, val):
        self._ensure_length(n)
        return super(ilist, self).__setitem__(n, val)
类ilist(列表):
定义初始化(self,r=None,dft=None):
如果r为无:
r=[]
列表。初始化(self,r)
self.dft=dft
定义长度(自,n):
maxindex=n
如果isinstance(最大索引,切片):
maxindex=maxindex.index(len(self))[1]

而len(self)很好。。。错误很明显。。。但也许有必要解释一下你真正想要实现的目标。。。到目前为止,你所得到的只是看起来一团糟,我不确定你真正想要的是什么……事实上,这就是我真正想要的。我不知道在重写一些基本方法时存在如此强大的方法
super
。哦,我想这就是为什么它被称为
super
。。。
def __setitem__(self, n, val):
    maxindex = n
    if isinstance(maxindex, slice):
        maxindex = maxindex.indices(len(self))[1]
    while len(self) <= maxindex:
        self.append(self.dft)
    return super(ilist, self).__setitem__(n, val)
class ilist(list):
    def __init__(self, r=None, dft=None):
        if r is None:
            r = []
        list.__init__(self, r)
        self.dft=dft

    def _ensure_length(n):
        maxindex = n
        if isinstance(maxindex, slice):
            maxindex = maxindex.indices(len(self))[1]
        while len(self) <= maxindex:
            self.append(self.dft)

    def __getitem__(self, n):
        self._ensure_length(n)
        return super(ilist, self).__getitem__(n)

    def __setitem__(self, n, val):
        self._ensure_length(n)
        return super(ilist, self).__getitem__(n)
class ilist(list):
    def __init__(self,r=list(),dft=None):
        list.__init__(self,r)
        self.dft=dft
    def __getitem__(self,n):
        if len(self)<=n:
            for i in range(n-len(self)+1):
                self.append(self.dft)
        return super(ilist, self).__getitem__(n)

x=ilist()
print x[4]
print x
class ilist(list):
    def __init__(self, r=None, dft=None):
        if r is None:
            r = []
        list.__init__(self, r)
        self.dft = dft

    def _ensure_length(self, n):
        maxindex = n
        if isinstance(maxindex, slice):
            maxindex = maxindex.indices(len(self))[1]
        while len(self) <= maxindex:
            self.append(self.dft)

    def __getitem__(self, n):
        self._ensure_length(n)
        return super(ilist, self).__getitem__(n)

    def __setitem__(self, n, val):
        self._ensure_length(n)
        return super(ilist, self).__setitem__(n, val)