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)