Два экземпляра класса совместно используются в Python - PullRequest
0 голосов
/ 23 ноября 2018

Так что это очень странно.Код ниже создает 2 экземпляра MyClass.Можно ожидать, что у каждого есть своя копия закрытой переменной __x, которая является словарем.Однако my_class2 обновляет значение __x в my_class1, что, по моему мнению, не должно происходить?

Чего мне не хватает?

class MyClass:
    __x = dict()

    def __init__(self, name, init_value):
        self.__x[name] = init_value

    def get_value(self):
        return self.__x


if __name__ == '__main__':
    my_class1 = MyClass("one", 1)
    print("my_class1: {}".format(my_class1.get_value()))
    my_class2 = MyClass("two", 2)
    print("my_class2: {}".format(my_class2.get_value()))
    print("my_class1: {}".format(my_class1.get_value()))

Приведенный выше код приводит к следующему выводу:

my_class1: {'one': 1}
my_class2: {'one': 1, 'two': 2}
my_class1: {'one': 1, 'two': 2}

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

В вашем случае, как вы определяли __x - это было class variable - т.е. переменная, которая используется всеми экземплярами этого класса.

Это можно увидеть, если вы запустите dir на своих экземплярах:

dir(my_class1)
['_MyClass__x', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'get_value']

Обратите внимание на первую запись - она ​​выше и ниже.

dir(my_class2) 
['_MyClass__x', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'get_value']
0 голосов
/ 23 ноября 2018

Вы должны объявить __x внутри функции __init__, например:

class MyClass:

    def __init__(self, name, init_value):
        self.__x = dict()
        self.__x[name] = init_value

    def get_value(self):
        return self.__x
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...