Python атрибут закрытого класса, возвращающий другое значение, чем его получатель - PullRequest
0 голосов
/ 04 мая 2020

Я играю с атрибутом частного класса, который имеет publi c getter

class MyClass:
    __val = 0

    def __init__(self):
        MyClass.__val += 1

    @classmethod
    def get_val(cls):
        return MyClass.__val

    def set_val(self):
        MyClass.__val += 1
        return


MyClass.__val = -1
print('Accessing attribute directly:', MyClass.__val)
print('Accessing attribute via getter:', MyClass.get_val())

Вывод, который я получаю:

Accessing attribute directly: -1
Accessing attribute via getter: 0

Как это я есть два объекта с разными значениями .__val из этого кода?

Ответы [ 3 ]

0 голосов
/ 04 мая 2020

Это происходит потому, что ты не завел класс. Затем, когда вы используете метод get_val (), он не вызывает метод __init__ для инициализации __val.
В противном случае, если вы создадите экземпляр MyClass, он сохранит значение, определенное в методе init . Но MyClass.__val все равно покажет -1, потому что это атрибут класса, а не атрибут экземпляра, подобный тому, который определен внутри init .

MyClass.__val = -1
m = MyClass()
print('Accessing attribute directly:', MyClass.__val)
print('Accessing attribute via getter:', MyClass.get_val())

enter image description here

0 голосов
/ 04 мая 2020

Нет двух объектов. Есть один объект с двумя разными атрибутами :

MyClass._MyClass__val

И

MyClass.__val

Это потому, что присвоение __val вне определения класса обходит механизм, который делает искажение имени. Итак:

MyClass.__val = -1

создать другую переменную . По сути, искажение имен происходит только в методах, скомпилированных как часть определения класса , из документов :

Любой идентификатор вида __spam (по крайней мере два начальных подчеркивания, самое большее одно конечное подчеркивание) текстуально заменяется на _classname__spam, где classname - это имя текущего класса с удаленными начальными подчеркиваниями. Это искажение выполняется без учета позиции syntacti c идентификатора, , если это происходит в определении класса .

0 голосов
/ 04 мая 2020

Они действительно опубликованы c, атрибуты класса привязаны к классу, и у класса есть только один. SO экземпляр объекта получит общее значение

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...