Почему метод класса не изменяет значение переменной?

Рейтинг: 0Ответов: 2Опубликовано: 19.01.2023

Простой пример на питоне, который поверг меня в ступор:

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 # статическая переменная класса 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. - это вообще другая история. Так тоже можно, конечно, но нужно понимать между ними разницу.

▲ 0
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