一个类的多个实例同时被覆盖?(蟒蛇)

jec*_*afa 7 python class instance python-3.x

这是一个非常简单的代码,用于演示我遇到的问题.这里发生的是我正在创建同一个类的两个不同实例,但更改一个属性会改变另一个实例的相应属性.我不确定为什么会这样.这在Python中是正常的还是我遇到了一些完全混乱的东西?

class exampleClass(object):

    attribute1=0
    attribute2="string"

x=exampleClass
x.attribute1=20
x.attribute2="Foo"

y=exampleClass
y.attribute1=60
y.attribute2="Bar"

print("X attributes: \n")
print(x.attribute1)
print(x.attribute2)

print("Y attributes: \n")
print(y.attribute1)
print(y.attribute2)
Run Code Online (Sandbox Code Playgroud)

这是程序从我的控制台出来的样子:

>>> 
X attributes: 

60
Bar
Y attributes: 

60
Bar
>>> 
Run Code Online (Sandbox Code Playgroud)

我认为应该说:

X attributes:

20
Foo
Y attributes:

60
Bar
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

Ned*_*der 8

当您需要实例属性时,您正在创建类属性.用这个:

class exampleClass(object):
    def __init__(self):
        self.attribute1 = 0
        self.attribute2 = "string"
Run Code Online (Sandbox Code Playgroud)

此外,您没有创建exampleClass的任何实例,您需要这样:

x = exampleClass()
y = exampleClass()
Run Code Online (Sandbox Code Playgroud)

您的代码只是为类使用新名称,并更改其属性.


dck*_*ney 5

您已经创建了属性类属性.这意味着它们的范围限于类本身,而不是类的对象.

如果你想要对象范围,你可以做类似的事情:

class exampleClass(object):
        def __init__(self):
            self.attribute1=0
            self.attribute2="string"

x = exampleClass()
y = exampleClass()
Run Code Online (Sandbox Code Playgroud)

然后,当您更改对象的属性值时,它仅影响该特定的值,而不是该类的所有对象.

  • 仍然需要做exampleClass()而不是exampleClass,否则它将是指向该类的蓝图的指针. (2认同)