【问题标题】:Two instances of class share same vairable in PythonPython中类的两个实例共享相同的变量
【发布时间】:2018-11-23 12:57:52
【问题描述】:

所以这很奇怪。下面的代码创建了 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}

【问题讨论】:

  • 是的。当然。错过了那个。实例变量在函数中定义。

标签: python-3.x class object


【解决方案1】:

您必须在 __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

【讨论】:

  • 是的,我刚发帖就知道了。谢谢。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-23
    • 1970-01-01
    • 1970-01-01
    • 2012-05-17
    • 2019-01-30
    • 2018-11-11
    • 1970-01-01
    • 2020-10-14
    相关资源
    最近更新 更多