为什么要更改此类中所有这些变量的所有实例?

时间:2019-05-10 17:06:05

标签: python-3.x class jupyter-notebook

我不明白为什么更改对象中的一个变量时会更改所有对象中该变量的所有实例。

编写该特定程序是为了显示我在编写的概率模拟中编写的错误/功能。在代表错误的这个文件中,我编写了一个名为“ thing”的类,其中有一个变量是一个名为“ gravity”的整数,当我更改一个对象的“ .gravity”时,它将全部更改。在这里,您去了:

import random
class thing:
    gravity = int
a = thing
b = thing
b.gravity = 9
ab = random.randint(1,2)

if ab == 1:
    a.gravity = 1
    print("1")
if ab == 2:
    a.gravity = 2
    print("2")
A = str(a.gravity)
B = str(b.gravity)
print("a.gravity = "+ A)
print("b.gravity = "+ B)

我希望a.gravity等于1或2,b.gravity等于9,但是b.gravity始终等于a.gravity不管做什么。我不知道该怎么办,任何反馈都很棒!。

1 个答案:

答案 0 :(得分:1)

您需要阅读更多有关如何在python中定义类的信息:首先从https://docs.python.org/3/tutorial/classes.html

开始
 class thing:
    gravity = int

并不是在python中定义类的方式,我什至不知道从哪里得到这种语法,但是代码起作用了,因为您已经用gravity=int定义了一个静态变量,这意味着有一个值每个类的字段,然后通过执行a.gravity = ..b.gravity = ..来修改代码中的值,如下所示

import random
class thing:
    gravity = int
a = thing
b = thing

b.gravity = 9
ab = random.randint(1,2)
print(a.gravity)
#9
print(b.gravity)
#9

if ab == 1:
    a.gravity = 1
    print("1")
if ab == 2:
    a.gravity = 2
    print("2")
A = str(a.gravity)
B = str(b.gravity)
print("a.gravity = "+ A)
#1 or 2
print("b.gravity = "+ B)
#1 or 2

当您执行b.gravity = 9时,a.gravity也变为9,而当您a.gravity = 1 or 2a.gravity进行b.gravity时也会发生同样的情况变成1或2

为您想要做的事情定义类的正确方法是

#Thing class
class thing:

    #Constructor where we pass value of gravity and assign it to gravity attribute of class
    def __init__(self, gravity):
        self.gravity = gravity

此后,创建类thing的对象的方法是执行a=thing(9),这基本上意味着a是重力为thing的类9的实例,其后是逻辑

#Define instance b of thing
b = thing(9)
ab = random.randint(1,2)

#Based on ab's value, instantiate a
if ab == 1:
    a = thing(1)
    print("1")
if ab == 2:
    a = thing(2)
    print("2")

在此之后,我们将为您提供打印逻辑

#Get the value of gravity for a and b
A = str(a.gravity)
B = str(b.gravity)
print("a.gravity = "+ A)
print("b.gravity = "+ B)

输出将是

1
a.gravity = 1
b.gravity = 9

2
a.gravity = 2
b.gravity = 9