Мне нужен magic variable в моем классе, и я начал его писать

class myclass:
    def __init__(self, name, *args):
        self.name = name
        ????

    def myFunc()
        for i in args:
            print(i)

Я просто не мог найти правильное объяснение того, как написать класс с магическими переменными в конструкторе и использовать его позже. Нужно ли создавать из него self. член (и если да, то как) или я могу пренебречь им и просто использовать аргументы, как в myFunc?

0
ruedi 13 Май 2019 в 09:01

2 ответа

Лучший ответ

*args не называются магическими переменными, но произвольный аргумент списки или variadic arguments, и они используются для отправки произвольного числа аргументов функции, и они заключены в кортеж, как в примере ниже

In [9]: def f(a,*args): 
   ...:     print(a) 
   ...:     print(args) 
   ...:                                                                                                                                                                           

In [10]: f(1,2,3,4)                                                                                                                                                               
1
(2, 3, 4)

Таким образом, чтобы получить доступ к этим переменным, вы должны делать то же, что и для любой переменной экземпляра класса, назначать ее через self.args = args и обращаться к ним через self.args

Также обратите внимание, что мы используем camel-case для имен классов, поэтому имя класса меняется на MyClass и snake-case для функций, поэтому имя функции меняется на my_func

class MyClass:
    def __init__(self, name, *args):
        self.name = name
        #Assigning variadic arguments using self
        self.args = args

    def my_func(self):
        #Accessing variadic arguments  using self
        for i in self.args:
            print(i)


obj = MyClass('Joe',1,2,3)
obj.my_func()

На выходе будет

1
2
3
2
Devesh Kumar Singh 13 Май 2019 в 06:17

Если вы назначите args на self.args, вы можете получить к ним доступ из других методов. Однако этот метод должен принять экземпляр класса в качестве первого аргумента (см. Ниже, как myFunc теперь принимает self).

class myclass:
    def __init__(self, name, *args):
        self.name = name
        self.args = args

    def myFunc(self):
        for i in self.args:
            print(i)
1
N Chauhan 13 Май 2019 в 06:10