类的两个实例在Python中共享相同的变量

时间:2018-11-23 12:57:52

标签: python-3.x class object

所以这很奇怪。下面的代码创建2个MyClass实例。可以期望每个人都有自己的私有变量__x的副本,后者是一本字典。但是,my_class2更新了my_class1中__x的值,我认为这不应该发生?

我想念什么?

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 :(得分:3)

您必须在__init__函数内部声明__x,如下所示:

class MyClass:

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

    def get_value(self):
        return self.__x

答案 1 :(得分:1)

在您的情况下,定义__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']