2010-04-20 4 views
0

У меня возникли проблемы с созданием списка для класса в Python. Я знаю, что есть что-то простое, с чем я не замечаю, но я просто не могу понять.Создание класса списка в Python

Мой базовый код до сих пор:

class Test: 
    def __init__(self,test): 
     self.__test = test 

Моя проблема заключается в том, что если я вхожу

t = Test([1,3,5]) 

все будет работать нормально, но если добавить

t = Test() 

Я получаю ошибка, что я не вводил достаточно параметров.

Я попытался добавить

def __init__(self,test=[]) 

в качестве параметра по умолчанию, который вроде работает, но тогда я не имею уникальные списки.

Я искал все, и я не могу понять, что я делаю неправильно. Любая помощь будет принята с благодарностью.

+0

, что вы имеете в виду с уникальным списки? – KillianDS

+0

См. Здесь: http://stackoverflow.com/questions/1132941/least-astonishment-in-python-the-mutable-default-argument – balpha

+3

Поскольку вы используете двузначное имя подчеркивания для вашего атрибута, вероятно, стоит отметить http://stackoverflow.com/questions/165883/python-object-attributes-methodology-for-access/166098#166098 –

ответ

4

Я не совсем уверен, что вы ищете, но вы, вероятно, хотите использовать None по умолчанию:

class Test: 
    def __init__(self,test=None): 
     if test is None: 
      self.__test = [] 
     else: 
      self.__test = test 
+2

Ваши две ветки немного однобокие. Либо присваивать 'self .__ test' в ветке' is None ', либо просто присваивать после 'if' без' else'. –

+0

@ Томас Воутерс: Ты прав. Я исправил это. –

+0

Здесь у меня были проблемы, я пробовал что-то подобное, но не использовал «Нет» в качестве теста по умолчанию. Это исправило мою программу. Спасибо тонну всем за помощь и дополнительное чтение! – Jef

3

Вы можете использовать следующую идиому:

class Test: 
    def __init__(self,test=None): 
     self.__test = test if test is not None else [] 
+0

+1. Та же концепция, что и мой ответ, но более сжатый синтаксис. –

+0

Yuck, тернарное выражение. –

+0

@ Томас Воутерс: Я полагал, что некоторые люди могут чувствовать это. Вот почему я оставляю свой ответ как есть. –

3

По умолчанию аргументы оцениваются один раз, когда функция определена, поэтому, когда вы делаете:

def __init__(self, test=[]): 

t он «тестовый» список делится между всеми вызовами __init__, которые не указывают аргумент test. То, что вы хотите, обычно выражается так: (. Или когда он передается None, очевидно)

def __init__(self, test=None): 
    if test is None: 
     test = [] 

Это создает новый список для каждого вызова, где test не передается аргумент

+1

Спасибо за объяснение, я знал, что это то, что происходит, я просто не знал, как правильно решить эту проблему. Я очень благодарен! – Jef

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