Давайте посмотрим на разницу между двумя классами:
class Test:
def __init__(self, var):
self.var = var
def test(self):
x = self.var + 2
return x
Давайте создадим объект Test:
t = Test(1)
И посмотри, что мы можем сделать
t.var # 1
t.x # Raises AttributeError : no such attribute in the class
t.test() #3
t.x # Still erroring
А с твоим вторым классом
class Test:
def __init__(self, var):
self.var = var
def test(self):
self.x = self.var + 2
return self.x
Давайте создадим объект Test:
t = Test(1)
И посмотрим, что мы можем сделать
t.var # 1
t.x # Raises AttributeError : no such attribute in the class
t.test() #3
t.x # 3
И что? Хорошо видно, что любые переменные, определенные с self.VARNAME
, сохраняются в экземпляре, тогда как простые локальные переменные, без self.
, не существуют.
Однако, если x должен быть доступен с t.x, я бы, наверное, выбрал свойство, например
class Test:
def __init__(self, var):
self.var = var
@property
def x(self):
x = self.var + 2
return x
t = Test()
t.x # 3