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

2024-09-30 22:28:14 发布

您现在位置:Python中文网/ 问答频道 /正文

这里有一个非常简单的代码来演示我遇到的问题。这里发生的事情是,我正在创建同一类的两个不同实例,但是更改一个实例的属性将更改另一个实例的相应属性。我不知道这是为什么。这在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)

下面是从我的控制台出来的程序:

>>> 
X attributes: 

60
Bar
Y attributes: 

60
Bar
>>> 

我想应该是说:

X attributes:

20
Foo
Y attributes:

60
Bar

我做错什么了?


Tags: 实例代码程序string属性objectfoobar
3条回答

您已经创建了attributes类属性。这意味着它们的作用域是类本身,而不是类的对象。

如果需要对象作用域,可以执行以下操作:

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

x = exampleClass()
y = exampleClass()

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

进行了修改,使其更清晰。

对于您拥有的代码,您的问题是您正在使变量x和y引用类定义,而不是实例化对象,我认为这些对象现在在所有的讨论和帖子中都已成为问题。

x = exampleClass

现在意味着x现在指向类定义。这很有趣,因为您将attribute1作为exampleClass的变量,所以可以执行以下操作:

x.attribute1 = 3

现在,如果您执行以下操作:

exampleClass.attribute1

现在你将看到3,而不是原来设置的0!

要实例化类的对象,需要执行以下操作:

x = exampleClass()
y = exampleClass()

现在,这两个变量都在引用新对象,每个对象都有自己的属性,因此如果这样做了:

x.attribute1 = 219

然后您会发现y.attribute1没有被修改:)在python中,使用类和函数的名称作为对定义的引用是很常见的。所以一定要小心,如果你想实例化一个对象,一定要用括号,如果你想调用一个函数,也一定要这样做,否则使用名称就是对定义的引用。

不过,我建议您阅读Ned Batchelder的答案(现在还有其他人),因为您应该使用in it函数以这种方式创建实例变量,因为它更加干净,更接近大多数遵循的设计标准。

但总的来说,因为它继承自对象类,所以您可以假设这样做会创建实例(带括号)等等,因此您可以修改对象值,因为我认为它们应该是实例变量,即使没有“self”。

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

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

另外,您没有创建任何exampleClass实例,您需要:

x = exampleClass()
y = exampleClass()

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

相关问题 更多 >