在Python类中存储变量

时间:2019-03-21 10:10:39

标签: python

我正在尝试确定这两种在类中创建变量的方法之间是否存在差异,哪种方法正确?

class example():
    var = 12

class example2():
    def __init__(self):
        self.var = 34

ob1 = example()
ob2 = example2()

print (ob1.var)
print (ob2.var)

这将按预期返回变量的内容:

12
34
>>> 

我已经搜索了stackoverflow以查看是否有任何东西,并且找不到比这两者更高的任何东西,当您知道答案时,我发现它总是更容易搜索。

谢谢

2 个答案:

答案 0 :(得分:1)

第一个是类变量,第二个是实例变量。您可以访问类变量而无需创建实例。您必须创建实例才能访问实例变量。这很明显,因为必须调用构造函数__init()__才能使class example2具有var

>>> example.var
12
>>> example2.var
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: type object 'example2' has no attribute 'var'

类变量在同一类的实例之间共享。如果考虑以下类,这将变得更加明显:

>>> class dummy():
...   dummy_list = []
...   def __init__(self):
...     self.dummy_list2 = []
...
>>> a = dummy()
>>> b = dummy()
>>> a.dummy_list.append(1)
>>> a.dummy_list2.append(2)
>>> b.dummy_list.append(3)
>>> b.dummy_list2.append(4)
>>> a.dummy_list
[1, 3]
>>> a.dummy_list2
[2]
>>> b.dummy_list
[1, 3]
>>> b.dummy_list2
[4]
>>> dummy.dummy_list
[1, 3]

您可以看到dummy_list在两个实例之间共享,但是每个实例都有自己的dummy_list2

答案 1 :(得分:1)

区别在于 example 中的var是类变量,而 example2 是实例变量。例如,这是有效的:

# Change the class value
example.var = 100
#change an instance value
instance = example()
instance.var = 101
# But they will be different
print(instance.var == example.var) # prints False
# but at the beginning they are the same
print(example().var == example.var) # prints True

这无效

# this will throw an error
example2.var = 100 

这是有效的

instance2 = example2()
instance2.var = 101

为了清楚起见,除非您有充分的理由,否则我将远离类变量(示例),并在 init 中初始化实例变量。

我真的希望我不要回答别人的作业。