2015-04-09 2 views
0

Я пытаюсь сделать функцию __init__() для класса. Вот пример того, где я застрял.Python Дополнительные параметры Цензура

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() takes 2 positional arguments but 4 were given

Есть ли способ, чтобы сделать эту работу для произвольного числа имен или, другими словами, последовательность имен?

ответ

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__ метод класса. Например:

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') 
+0

'= список (имена) ...' –

+0

@AshwiniChaudhary Хорошая точка! 'names' будет изначально кортежем. Это подходит/достаточно «list-like» для многих операций последовательности, но для некоторых потребуется истинный «список». Добавлена ​​личность. –

0

Вместо передачи имен в качестве аргументов передать список имен, то и не нужно вносить какие-либо изменения в свой __init__() метод

поэтому вместо

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

использование

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

и ваш код init() будут работать нормально.

Смежные вопросы