2013-11-07 21 views
1

Я пытаюсь заставить некоторые args работать в классе, я уже получил его в функции от How to use *args in a function?.Как использовать * args в классе python?

Я пытаюсь получить эту функцию в классе, но я, похоже, не понимаю, как инициализировать этот класс, который имеет функцию init, принимающую * args. Код выглядит следующим образом:

class classname(object): 
    def __init__(self, *args): 
     <code-snip> 
     ... 
     </code-snip> 

if __name__ == "__main__": 
    start = classname() 
    start() 

Итак, я смущен тем, что делать с 'start()'. Должен ли я использовать «start (* sys.argv [1:])» или «start()». Оба, похоже, не работают. Я хочу получить * args, который ожидается в init, который будет передан должным образом.

Любые указатели, пожалуйста.

Благодаря тонну ..

======

Я извиняюсь, если я не ясно, на котором подробно, как это не сработало.

а) При использовании старт (* sys.argv [1:])

Traceback (most recent call last): 
    File "check.py", line 126, in <module> 
    start(*sys.argv[1:]) 
TypeError: 'check' object is not callable 

б) При использовании старт(), я получаю:

Traceback (most recent call last): 
    File "check.py", line 126, in <module> 
    start() 
TypeError: 'check' object is not callable 

Это были ошибки, которые пришли вверх.

@alko, да, вы правы. Я смотрел, как получить * args в init прошел правильно.

+0

прочитал этот вопрос, вы понимаете концепцию http://stackoverflow.com/questions/3394835/args-and-kwargs – MONTYHS

+0

@MONTYHS раздражения, очевидно, происходит от неопределенности, какие методы вызываются, когда, а не из '*, **' материал сам. – glglgl

+0

Если бы я получил ни копейки всякий раз, когда читал «Это не работает» без каких-либо дополнительных объяснений, я был бы богат. – glglgl

ответ

5

Объекты создаются путем передачи аргументов class constructor. Они, в свою очередь, активируются функцией __init__. В вашем примере это будет

start = ClassName(*sys.argv[1:]) 

, что выражение обрабатывается следующим образом:

  1. Новый экземпляр имя класса создается с object.__new__(ClassName, *sys.argv[1:]) именем start в местной namespace. Отныне объект start объект может ссылаться внутри вашего сценария if __name__ == "__main__".
  2. Его содержимое в свою очередь инициализируется при вызове start.__init__(*sys.argv[1:]). Обратите внимание, что аргументы __init__ те же, что и для конструктора.

И читать PEP 8 для обозначения именования питонов. То есть:

Имена классов обычно должны использовать соглашение CapWords.

0

Ваш пример содержит класс, который первым инстанцированный - который включает в себя вызов __init__() - и тогда называется - что делается по телефону __call__().

Таким образом, ваш материал должен быть помещен в звонок start = classname(...), чтобы быть отправленным в __init__().

Однако вызов только что созданного объекта завершится неудачей, если он не содержит метод __call__(). Это было бы легче ответить, если бы вы сказали нам, что

И не похоже на работу.

точно означает.

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