Python类共享变量提供了意外的输出

Python类共享变量提供了意外的输出,python,class,oop,Python,Class,Oop,根据这里的解释,我希望以下代码给出如下输出: 123 123 200 200 300 300 但事实确实如此 123 123 200 123 200 300 代码: 有人能帮我理解吗?我的印象是共享变量与C++类中的静态变量相同。任何打破这种神话的洞见,如果是这样的话,也会有所帮助 您正在创建一个新的实例变量->a.abc并将其设置为200。改为访问共享静态变量 a = A(2, 4, 6) b = A(3, 9, 27) print a.abc , b.abc A.abc = 200 #

根据这里的解释,我希望以下代码给出如下输出:

123 123
200 200
300 300
但事实确实如此

123 123
200 123
200 300
代码:


有人能帮我理解吗?我的印象是共享变量与C++类中的静态变量相同。任何打破这种神话的洞见,如果是这样的话,也会有所帮助

您正在创建一个新的实例变量->
a.abc
并将其设置为
200
。改为访问共享静态变量

a = A(2, 4, 6)
b = A(3, 9, 27)
print a.abc , b.abc
A.abc = 200  # Set static class variable, instead of creating new instance member
print a.abc , b.abc
A.abc = 300
print a.abc , b.abc

我建议您阅读上内容丰富的Python官方文档。

您正在创建一个新的实例变量->
a.abc
,并将其设置为
200
。改为访问共享静态变量

a = A(2, 4, 6)
b = A(3, 9, 27)
print a.abc , b.abc
A.abc = 200  # Set static class variable, instead of creating new instance member
print a.abc , b.abc
A.abc = 300
print a.abc , b.abc

我建议您阅读上内容丰富的Python官方文档。

最初,A类的
abc
定义为123,这是
A
b
各自使用的,因为它们都没有自己的
abc

然后执行
a.abc=200
,这将为
a
创建一个
abc
<代码>b仍使用
A
中的代码


然后执行
A.abc=300
,它会更新
A
abc
,而
b
仍会查看,因此它会看到新值。但是
a
有自己的
abc
,所以不在乎。

最初,a类有一个
abc
定义为123,每个
a
b
都使用它,因为它们都没有自己的
abc

然后执行
a.abc=200
,这将为
a
创建一个
abc
<代码>b仍使用
A
中的代码


然后执行
A.abc=300
,它会更新
A
abc
,而
b
仍会查看,因此它会看到新值。但是
a
有它自己的
abc
,所以不在乎。

您的预期输出意味着您不能在不更改objects类的每个实例的属性的情况下更改对象的属性。这显然会打破面向对象思想的核心。我认为您可以覆盖“共享”变量,因为这提供了更多的可能性。

您预期的输出将意味着您无法在不更改对象类的每个实例的属性的情况下更改对象的属性。这显然会打破面向对象思想的核心。我认为你可以改写“共享”变量,因为这给了更多的可能性。

解释了代码中的问题,但我想在这里添加C++透视图。不幸的是,由于它太长,无法在该答案中添加为注释

<>如在C++中,访问静态成员名需要用类名限定(例如:<代码>:ABC 或 A::FooSimStic()/代码>,在Python中,还必须使用类名作为限定符访问类外的共享变量。

类内,C++允许使用静态变量名,像其他成员变量(即没有任何限定符),Python也一样,因为共享变量可以用Soad来访问,如<代码> SUB.ABC 此处。 这里唯一不同的是Python允许您仅为该实例创建一个与共享变量同名的实例变量

< P>解释了代码中的问题,但我想在这里添加C++透视图。不幸的是,由于它太长,无法在该答案中添加为注释

<>如在C++中,访问静态成员名需要用类名限定(例如:<代码>:ABC
A::FooSimStic()/代码>,在Python中,还必须使用类名作为限定符访问类外的共享变量。

类内,C++允许使用静态变量名,像其他成员变量(即没有任何限定符),Python也一样,因为共享变量可以用Soad来访问,如<代码> SUB.ABC 此处。


这里唯一不同的是Python允许您仅为该实例创建一个与共享变量同名的实例变量

它们是不同的对象,更改一个对象不应影响另一个对象。
a.abc=200
,您为对象a创建了一个名为
abc
的新实例变量。@AhsanulHaque:但“abc”应该是共享对象。不是吗?当您执行
a.abc=…
时,您创建了一个与类变量
a.abc
完全分离的实例变量,因此,更改
A.abc
将反映所有其他实例中的更改,其中as
A.abc
将只更改一个实例。更改
A.abc=200
为'A.abc=200'它们是不同的对象,更改一个对象不应影响另一个对象。
A.abc=200
,您为对象a创建了一个名为
abc
的新实例变量。@AhsanulHaque:但是“abc”应该是共享对象。不是吗?当您执行
a.abc=…
时,您创建了一个与类变量
a.abc
完全分离的实例变量,因此,更改
A.abc
将反映所有其他实例中的更改,其中as
A.abc
将只更改一个实例。更改
A.abc=200
为'A.abc=200'我想问题是为什么输出是这样的,不是如何更改代码以产生预期的输出。由于正在创建实例变量,它会产生意外的输出。我可以解释python的运行时调度,以及类是如何成为对象的。这就是为什么可以在运行时将成员添加到
self
a
只是实例,它们的行为都是一样的。初始值设定项的行为,在python中的实现方式与在c/c++等静态语言中的实现方式大不相同。我保持了简短的回答。我想问题是为什么