这里有一个非常简单的代码来演示我遇到的问题。这里发生的事情是,我正在创建同一类的两个不同实例,但是更改一个实例的属性将更改另一个实例的相应属性。我不知道这是为什么。这在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
我做错什么了?
您已经创建了attributes类属性。这意味着它们的作用域是类本身,而不是类的对象。
如果需要对象作用域,可以执行以下操作:
然后,当更改对象的属性值时,它只影响该特定对象,而不是该类的所有对象。
进行了修改,使其更清晰。
对于您拥有的代码,您的问题是您正在使变量x和y引用类定义,而不是实例化对象,我认为这些对象现在在所有的讨论和帖子中都已成为问题。
现在意味着x现在指向类定义。这很有趣,因为您将attribute1作为exampleClass的变量,所以可以执行以下操作:
现在,如果您执行以下操作:
现在你将看到3,而不是原来设置的0!
要实例化类的对象,需要执行以下操作:
现在,这两个变量都在引用新对象,每个对象都有自己的属性,因此如果这样做了:
然后您会发现y.attribute1没有被修改:)在python中,使用类和函数的名称作为对定义的引用是很常见的。所以一定要小心,如果你想实例化一个对象,一定要用括号,如果你想调用一个函数,也一定要这样做,否则使用名称就是对定义的引用。
不过,我建议您阅读Ned Batchelder的答案(现在还有其他人),因为您应该使用in it函数以这种方式创建实例变量,因为它更加干净,更接近大多数遵循的设计标准。
但总的来说,因为它继承自对象类,所以您可以假设这样做会创建实例(带括号)等等,因此您可以修改对象值,因为我认为它们应该是实例变量,即使没有“self”。
当您需要实例属性时,您正在创建类属性。使用这个:
另外,您没有创建任何exampleClass实例,您需要:
您的代码只是使用类的新名称,并更改其属性。
相关问题 更多 >
编程相关推荐