Установка / Сброс значения переменной, которая объявлена ​​и инициализирована в __init__ в __main__ - PullRequest
0 голосов
/ 18 марта 2020

Я хотел бы установить / сбросить значение переменной, которую я инициализировал в init в main . У меня есть следующий код.

class myClass:

    def myfun(self):

       # code using the url

    def __init__(self):
        self.url = None

if __name__ == '__main__':

   # list of integers
   my_list = [1, 2, 3,4,5]
   count = 0

   for item in my_list:
       if count % 2 == 0:
           self.url = "http://myurl.com" # I want to set/reset my url here

Я получил эту ошибку:

NameError: имя 'self' не определено`

Что может Я делаю, чтобы установить / сбросить мою переменную, которая позже может использоваться глобально во всех методах моего класса?

Ответы [ 4 ]

1 голос
/ 18 марта 2020

Проблема в том, что self представляет объект, созданный из класса, и недоступен в операторе if main.

self следует использовать только внутри методов класса.

Вам нужно будет создать экземпляр myClass, а затем вызвать myClass.url

, например:

class MyClass:

def myfun(self):

   # code using the url

def __init__(self):
    self.url = None

if __name__ == '__main__':

   # list of integers
   my_list = [1, 2, 3,4,5]
   count = 0
   my_class = MyClass()


   for item in my_list:
       if count % 2 == 0:
           my_class.url = "http://myurl.com" # I want to set/reset my url here

Я также взял на себя смелость переименовать ваш класс в MyClass, так как это больше pythoni c

1 голос
/ 18 марта 2020

Вам нужно создать экземпляр вашего класса и использовать это имя для обозначения вашего класса, а не self. Например:

class myClass:

    def myfun(self):
        pass
       # code using the url

    def __init__(self):
        self.url = None

if __name__ == '__main__':

   # list of integers
   my_list = [1, 2, 3,4,5]
   count = 0
   obj = myClass() # HERE!
   for item in my_list:
       if count % 2 == 0:
           obj.url = "http://myurl.com"

Вы должны ссылаться на свой класс как obj после создания его экземпляра (или любого другого имени, которое вы ему дали). Если вы не создаете экземпляр класса, это просто некий скелет с предопределенными свойствами и поведением, но его пока нет. Вы не можете манипулировать им до создания экземпляра.

После его создания вы можете обратиться к нему с именем экземпляра, obj в моем примере. self в классе относится к самому себе, независимо от того, как он вызывается при создании экземпляра. Поэтому вне класса вы не можете использовать self.

1 голос
/ 18 марта 2020

Я думаю, вам нужна переменная класса.

, которая может быть использована позже во всех методах моего класса

Когда вы используете self.url, если в экземпляре нет атрибута url, он будет ссылаться на переменную класса. Это доступно всем экземплярам. Если вы определите self.url в некоторых случаях, их self.url будет затенено.

class MyClass:
    url = None

    def my_fun(self):
        print(self.url)
        # code using the url


if __name__ == '__main__':

    # list of integers
    my_list = [1, 2, 3, 4, 5]
    count = 0
    my_object = MyClass()

    for item in my_list:
        if count % 2 == 0:
            MyClass.url = "http://myurl.com"  # I want to set/reset my url here
            my_object.my_fun()
1 голос
/ 18 марта 2020

Защита импорта if __name__ == '__main__': и все, что в ней находится, находится в глобальном пространстве имен. Это не часть вашего класса, а тем более метод в классе. Чтобы иметь экземпляр вашего класса, вам нужно создать его экземпляр:

my_obj = myClass()

Теперь, в том же пространстве имен вы можете сделать

my_obj.url = ...

с последующим

my_obj.myfun()
...