UserList重载python 3.x

时间:2017-03-06 23:45:36

标签: python overloading

我正在尝试重载UserList方法(添加,追加,扩展)以获得没有重复项。出于某种原因,我仍然得到ui-router两次。如果我只是尝试打印alpha,我甚至会得到一个空列表。这是我写的代码:

original_list

免责声明:我知道有人问过有关UserList和方法重载的类似问题。我分析了这些问题,但仍然无法弄清楚为什么我的代码不起作用。另外,我是Python的新手。

2 个答案:

答案 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]