我正在尝试确定这两种在类中创建变量的方法之间是否存在差异,哪种方法正确?
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以查看是否有任何东西,并且找不到比这两者更高的任何东西,当您知道答案时,我发现它总是更容易搜索。
谢谢
答案 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 中初始化实例变量。
我真的希望我不要回答别人的作业。