我想在Python中实现自定义列表类作为的子类list
。list
为了获得所有列表操作的完全类型兼容性,我需要从基类中重写的最少方法集是什么?
这个问题表明至少__getslice__
需要重写。从进一步的研究,也__add__
和__mul__
是必需的。所以我有这段代码:
class CustomList(list):
def __getslice__(self,i,j):
return CustomList(list.__getslice__(self, i, j))
def __add__(self,other):
return CustomList(list.__add__(self,other))
def __mul__(self,other):
return CustomList(list.__mul__(self,other))
下列语句即使没有覆盖方法也可以按需工作:
l = CustomList((1,2,3))
l.append(4)
l[0] = -1
l[0:2] = CustomList((10,11)) # type(l) is CustomList
这些语句仅与上述类定义中的覆盖方法一起使用:
l3 = l + CustomList((4,5,6)) # type(l3) is CustomList
l4 = 3*l # type(l4) is CustomList
l5 = l[0:2] # type(l5) is CustomList
我唯一不知道如何实现的是使扩展切片返回正确的类型:
l6 = l[0:2:2] # type(l6) is list
我需要在类定义中添加些什么才能获得CustomList
类型l6
?
另外,除了扩展切片之外,是否还有其他列表操作,其结果将是list
类型而不是类型CustomList
?
首先,我建议您遵循BjörnPollex的建议](+1)。
为了克服这个特殊问题(type(l2 + l3) == CustomList
),您需要实现一个自定义__add__()
:
def __add__(self, rhs):
return CustomList(list.__add__(self, rhs))
对于扩展切片:
def __getitem__(self, item):
result = list.__getitem__(self, item)
try:
return CustomList(result)
except TypeError:
return result
我也建议…
pydoc list
…在命令提示符下。您将看到list
公开了哪些方法,这将为您提供有关需要重写哪些方法的良好指示。
问题内容: 在开发桌面应用程序时,我在Oracle Network上关注本文以实现MVC。但是,我有一个问题:我正在使用由和扩展的抽象 Directory 类。模型管理器方法之一接受Directory作为参数: 抽象控制器使用setModelProperty调用此方法: 我从实际的控制器中这样调用它: 我认为我有: 我有以下错误: 我该如何解决这个问题?我在使用时缺少一些东西。 编辑:我已经阅读了
问题内容: 我想向内置类型添加一些属性,所以我这样写: 但仅包含元素。为什么我在这里不工作?我应该如何从类似内置类型的继承?像这样的不可变类型是否相同? 问题答案: 该类型通常在其方法内进行列表的实际初始化,因为这是可变类型的约定。子类型化不可变类型时,只需要覆盖即可。虽然 可以在对列表进行子分类时覆盖,但对于您的用例而言,这样做没有多大意义。覆盖比较容易: 另请注意,在这种情况下,建议不要使用。
我在应用程序中实现了firebase,以便使用它的通知服务,它工作了,今天决定使用它的键/值特性,但意识到无论我在从继承的类中编写什么,都不会发生任何事情。所以我决定移除my类以达到dubugging的目的,但我还是收到了通知。所以我从清单中删除了firebase消息传递服务,删除了应用缓存并运行了项目,但我仍然得到通知!我能阻止通知到来的唯一方法是移除Gradle中的firebase依赖项。这里
我正在尝试安装一个没有依赖项的python模块。 我跑: 但是这个安装依赖项,任何想法怎么能做到这一点?
问题内容: 我是Python的新手,正在尝试安装此模块:http : //www.catonmat.net/blog/python-library-for-google- search/ 目录中没有setup.py,但是有以下文件: 有人可以告诉我如何设置或使用此模块吗? 谢谢! 问题答案: 在系统上开始使用该代码的最简单方法是: 将文件放入计算机上的目录中, 将该目录的路径添加到您的PYTHON