Python - не может получить доступ к переменной в классе

1

У меня есть основной вопрос python. Я работаю над классом foo, и я использую __init__(): для выполнения некоторых действий над значением:

class foo():
  def __init__(self,bar=None):
    self.bar=bar
    if bar is None: 
       isSet=False  
    else:
       isSet=True
  print isSet

Когда я выполняю код, я получаю: NameError: name 'isSet' is not defined.
Как я могу получить доступ к isSet? Что я делаю неправильно?

С уважением, Мартин

  • 1
    Ваше имя класса должно быть Foo как имена классов должны использовать соглашение CapitalizedWords в соответствии с PEP8
  • 1
    И его член должен быть также is_set, так как члены используют lowercase_with_underscores.
Теги:

5 ответов

4

Неправильный отступ, это должно быть так, иначе вы выходите из функции.

class foo():
  def __init__(self,bar=None):
    self.bar=bar

    if bar is None: 
       isSet=False  
    else:
       isSet=True

    print isSet
  • 0
    Да, я хочу выполнить это в контексте класса. Так что отступ правильный. Я хочу получить доступ к isSet из кода, расположенного в классе, а не в def __init __ ()
  • 0
    @Martin: Тогда это не имеет смысла, потому что __init__ запускается только при создании экземпляра, а не при создании класса. Что ты на самом деле пытаешься сделать?
Показать ещё 2 комментария
3

Это зависит от того, что вы пытаетесь сделать. Вероятно, вы хотите, чтобы isSet был членом foo:

class foo():
  def __init__(self,bar=None):
    self.bar=bar
    self.isSet=True
    if bar is None: 
       self.isSet=False  

f = foo()
print f.isSet
1

В вашем коде isSet есть атрибут класса, в отличие от атрибута экземпляра. Поэтому в классе класса вам необходимо определить его, прежде чем ссылаться на него в инструкции print. Вне класса и его методов вы должны префикс его с именем класса и точкой, т.е. Foo. в этом случае. Обратите внимание, что код в теге def __init__() не выполняется, пока вы не создадите экземпляр класса Foo, вызвав его.

class Foo(object):
    isSet = None

    def __init__(self, bar=None):
        self.bar = bar

        if bar is None:
           Foo.isSet = False
        else:
           Foo.isSet = True

    print isSet

f = Foo()
print Foo.isSet

выход:

None
False
1

Я бы попробовал

class foo():
  def __init__(self,bar=None):
    self.bar = bar
    self.is_set = (bar is None)

Тогда внутри класса

...
def spam(self, eggs, ham):
    if self.is_set:
        print("Camelot!")
    else:
...

Вы читали запись в учебнике doc о классах?

0

Отступ итоговой строки заставляет ее выполнять в контексте класса, а не __init__. Отступьте еще раз, чтобы ваша программа работала.

  • 0
    Это именно то, что я хочу, я хочу выполнить это в контексте класса, а не в init
  • 1
    @Martin Что означает «выполнить в контексте класса»? Если это означает внутри метода-члена, смотрите ответы, если это означает, что при объявлении класса вы не можете получить доступ к чему-либо, созданному в __init__ , потому что __init__ никогда не вызывался.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню