学语言千万别想当然。对于python语言,如果当做c++或者c#来学,是很危险的一件事。
比如
class student():
pass
a = student
b = student()
如果按照c++的理解,两者可以理解为a = new student, b = new student(),那么两个的含义是一样的。但对于python,这两个的含义是完全不同的。
由于python中所有的类都是对象,包括object类,int类,str类,统统都是对象。因此,a表示student对象的引用,注意,不是student生成的对象的引用,a就是student。甚至可以写c =a(),等价于c=student()。
而第二种形式b=student()表示b为student生成的对象的引用。如果非要测试,可以这样
class student():
pass
a = student
b = student()
print(type(a))
print(type(b))
type(a)为<class 'type'>,而type(b)为<class '__main__.student'>。可见,a就是student。如果明白了这些,可以在测试一道题目:
class student():
pass
a = student
b = student()
a.name = 'aaa'
c = student()
print(b.name)
print(c.name)
结果应该都是aaa,而不应该报错。为什么,因为python的类为动态的,不是静态的哦。改变了a就是改变了student,当然就改变了b,c。b,c是student的对象的引用嘛。
但可能有同学有疑问:c我可以理解,为什么b也会改变,b生成的时候,student还没有name成员呢。
问题很好,我当时也不明白,使得我不得不阅读了一下python的源码。简单说来,就是python的所有类都是对象。什么意思?简单画个图。实际上,a,b,c的关系是这样的:
当然,实际的关系要复杂的多,只是简单表示了一下,a,b,c,student的关系。可以看到,实际上b是指向student对象的,所以,无论什么时候,只要student发生了变化,那么b就可以看到。
Ps:本人python菜鸟,正在苦学python,写此文只是给遇到同样问题的人提醒一下,认识比较粗浅,请大牛们莫拍。