Как использовать *args в классе Python?

Я пытаюсь заставить некоторые аргументы работать в классе, я уже запустил его в функции из Как использовать *args в функции?.

Я пытаюсь добавить эту функцию в класс, но, похоже, не понимаю, как инициализировать этот класс, в котором есть функция 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, передавались правильно.

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

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

======

Извините, если я не ясно объяснил, как это не сработало.

а) При использовании start(*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

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

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

Вот такие ошибки вылезли.

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


person vimal    schedule 07.11.2013    source источник
comment
прочитайте этот вопрос, вы понимаете концепцию   -  person MONTYHS    schedule 07.11.2013
comment
@MONTYHS Раздражение, очевидно, возникает из-за неуверенности в том, какие методы когда вызываются, а не из-за самого материала *, **.   -  person glglgl    schedule 07.11.2013
comment
Если бы я получал десять центов каждый раз, когда я читал «Это не работает без каких-либо дополнительных объяснений», я был бы богат.   -  person glglgl    schedule 07.11.2013
comment
имхо, это четко указано как I want to get the *args which is expected in init to be passed properly.   -  person alko    schedule 07.11.2013


Ответы (2)


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

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

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

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

И прочтите PEP 8, чтобы узнать о соглашении об именах в Python. То есть:

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

person alko    schedule 07.11.2013

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

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

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

Кажется, оба варианта не работают.

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

person glglgl    schedule 07.11.2013