Python可选参数截断

时间:2015-04-09 17:12:04

标签: python class sequence

我正在尝试为一个类创建一个__init__()函数。这是我遇到困难的一个例子。

class Names():
    """a class for storing a number of names"""

    def __init__(self, names): #names can be any sequence of strings
        """takes a sequence of names and puts them into a list"""
        self.name_list = []
        for element in names:
            self.name_list.append(element)

但是当我尝试时:

Names("John", "Bobby", "Sarah")   

我收到错误消息

  

TypeError: init ()需要2个位置参数,但是给出了4个

有没有办法让这个工作适用于任意数量的名称,换句话说是一系列名称?

2 个答案:

答案 0 :(得分:0)

不确定。您需要使用*运算符来表示可变数量的参数。像这样:

class Names():
    """a class for storing a number of names"""

    def __init__(self, *names): #names is can be any sequence of strings
        """takes a sequence of names and puts them into a list"""
        self.name_list = list(names)

然后,您提供的许多名称将存储在name_list中。

>>> Names("John", "Bobby", "Sarah")
<__main__.Names instance at 0x102b1c0e0>

你可以通过给类自己的__repr__方法来解决这个问题。 E.g:

def __repr__(self):
    clsname = self.__class__.__name__
    namestr = ", ".join(repr(n) for n in self.name_list)
    return "{0}({1})".format(clsname, namestr)

然后:

>>> Names("John", "Bobby", "Sarah")
Names('John', 'Bobby', 'Sarah')

答案 1 :(得分:0)

代替传递名称作为参数传递名称列表,您不需要对__init__()方法进行任何更改

所以而不是

Names("John", "Bobby", "Sarah") 

使用

Names(["John", "Bobby", "Sarah"]) 

并且您的init()代码可以正常工作。