我正在尝试重载UserList方法(添加,追加,扩展)以获得没有重复项。出于某种原因,我仍然得到ui-router
两次。如果我只是尝试打印alpha
,我甚至会得到一个空列表。这是我写的代码:
original_list
免责声明:我知道有人问过有关UserList和方法重载的类似问题。我分析了这些问题,但仍然无法弄清楚为什么我的代码不起作用。另外,我是Python的新手。
答案 0 :(得分:1)
这只是一个答案,但我强烈建议尝试相互执行类似的操作。例如,__add__
实际上只是构造,后跟extend
操作。而extend
实际上只是重复了append
。如果性能不是绝对关键的(当你实现自己的UserList
时,你已经放弃了性能,基本上),拥有一个已知的良好实现并以术语实现其他操作要容易得多已知的良好操作。
因此,例如,__add__
可以实现为:
def __add__(self, other):
ret = self.__class__(self) # Alt: self.copy()
ret.extend(other)
return ret
现在只要你的构造函数和extend
方法正确,__add__
就会自动正确。
然后根据extend
:
append
def extend(self, other):
for x in other:
self.append(x)
现在,如果append
正确,那么extend
和__add__
也是如此。现在,您需要做的就是让append
正确(并且您可以单独测试它,直到您确定它是正确的。)
碰巧,您的append
已经是正确的(假设print
是报告错误的合理方式,通常不是)。因此,使用此__add__
和extend
以及一个有效的初始化方法,您将拥有可用的代码。
尽管如此,您现有的代码实际上并不会正常运行。你的初始化程序错了;您将self.info
设置为输入可迭代,但self.info
从未使用collections.UserList
(它使用data
属性)。如果您想制作一个安全的初始化程序,请执行以下操作:
def __init__(self, info=()): # Never use mutable default arguments
UserList.__init__(self)
self.extend(info) # Reuse known good code
再一次,这重用了已知的好代码;如果extend
有效(反过来又取决于append
),则此初始化程序很好。如果您希望针对复制方案进行优化,则可以使用类内部来保存重复检查工作:
def __init__(self, info=()):
UserList.__init__(self)
if isinstance(info, Ulist):
# Already deduped, copy without duplicate checking
self.data[:] = info.data
else:
self.extend(info)
这个答案的要点是:从碎片中构建,don't repeat yourself (mnemonic: DRY)。当它们彼此之间存在各种变化时,不要试图从头开始实现每种方法。确定单个“公分母”功能,并在此基础上构建,因此任何给定的方法可以做一件简单的事情,或者以最小化自定义代码的方式实现另一种方法。
答案 1 :(得分:0)
你想做这样的事吗?
from collections import UserList
class Ulist(UserList):
def __init__(self, info = []):
UserList.__init__(self)
self.info = info
def add_iterable(self, iterable):
for i in iterable:
if i in self:
print('%r This is already in the list.' % (i))
else:
UserList.append(self, i)
return self
def __add__(self, something_new):
if hasattr(something_new, '__iter__'):
return self.add_iterable(something_new)
else:
return UserList.append(self, something_new)
def append(self, something_new):
if something_new in self:
print('%r This is already in the list.' % (i))
else:
return UserList.append(self, something_new)
def extend(self, something_new):
return self.add_iterable(something_new)
测试输出:
98这已经在列表中。
'alpha'这已经在列表中。
[444,'alpha','I_dont_exist_yet',0,98,234,'beta','I_am_totally_new',33]