У меня есть основной вопрос 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
? Что я делаю неправильно?
С уважением, Мартин
Неправильный отступ, это должно быть так, иначе вы выходите из функции.
class foo():
def __init__(self,bar=None):
self.bar=bar
if bar is None:
isSet=False
else:
isSet=True
print isSet
__init__
запускается только при создании экземпляра, а не при создании класса. Что ты на самом деле пытаешься сделать?
Это зависит от того, что вы пытаетесь сделать. Вероятно, вы хотите, чтобы 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
В вашем коде 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
Я бы попробовал
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 о классах?
Отступ итоговой строки заставляет ее выполнять в контексте класса, а не __init__
. Отступьте еще раз, чтобы ваша программа работала.
init
__init__
, потому что __init__
никогда не вызывался.
Foo
как имена классов должны использовать соглашение CapitalizedWords в соответствии с PEP8