Почему метод класса не изменяет значение переменной?
Простой пример на питоне, который поверг меня в ступор:
class A:
a = 0
def set_a(s):
a = s
print(a)
A.set_a(10) # 10
print(A.a) # 0
Почему после присваивания переменной a в методе set_a значения 10, она всё равно равна 0?
Ответы (2 шт):
class A:
a = 0
def set_a(s):
a = s
print(a)
A.set_a(10) # 10
print(A.a) # 0
a в set_a локальная переменная, a в классе он просто не видит и создает новую переменную
Чтобы обращаться к элементам класса, необходимо в параметрах класса указывать self первым параметром, а также обращаться к элементам класса с помощью self.. Методы без self в параметрах будут являться статическими, в подобных методах изменять значения переменных класса изменять нельзя, только при обращении к классу напрямую
Для хранения переменных класса необходимо объявить переменную этого класса
class A:
a = 0
def set_a(self,s):
self.a = s
print(self.a)
a = A()
a.set_a(10) # 10
print(a.a) # 10
Если вы хотите изменить переменные класса, то необходимо обращение к ним:
class A:
a = 0
def set_a(s):
A.a = s
print(A.a)
A.set_a(10) # 10
print(A.a) # 10
class A:
a = 0 # статическая переменная класса A
def set_a(s):
a = s # локальная переменная функции set_a
Вы пытаетесь менять статическую переменную класса, ну так надо указывать её полное наименование всегда (кроме начальной инициализации сразу после class):
class A:
a = 0
def set_a(s):
A.a = s
print(A.a)
A.set_a(10) # 10
print(A.a) # 10
Везде кроме описания переменной непосредственно сразу в class нужно указывать её полное название (с классом впереди). Иначе вместо неё вы присваиваете значение новой локальной переменной. Просто сразу внутри класса это статическая переменная класса, а внутри метода класса - это уже локальная переменная этого метода.
P.S. Переменные экземпляра класса, которые через self. - это вообще другая история. Так тоже можно, конечно, но нужно понимать между ними разницу.