类属性指的是定义在class内部的,而实例属性是则与某个特定的实例(对象)有关。定义过于抽象了,看看例子。
class Book:
num_pages = 100
def __init__(self, name):
self.name = name
tricks = Book('tricks')
fluent = Book('fluent')
tricks.num_pages, fluent.num_pages #这个就是实例属性
Out[48]: (100, 100)
Book.num_pages #这个就是类属性
Out[49]: 100
目前的一切看起来很正常,但是如果类属性想要访问init方法构建的,属于每个实例的实例属性。
Book.name
Traceback (most recent call last):
File "<ipython-input-50-213752b711a8>", line 1, in <module>
Book.name
AttributeError: type object 'Book' has no attribute 'name'
Python解释器会告诉你,Book这个类没有属性name。而这个就是实例属性和类属性最大的差别。不过还需要注意到的问题是:
Book.num_pages=19
tricks.num_pages, fluent.num_pages
Out[52]: (19, 19)
我们修改了类属性num_pages,实例tricks,fluent也发生了改变。再看看:
tricks.num_pages=20
tricks.num_pages, fluent.num_pages
Out[54]: (20, 19)
Book.num_pages
Out[55]: 19
我们修改了实例tricks的num_pages,但是fluent没有受到影响,并且Book类属性也没有受到影响。不过如果我们调用内部的__class__方法:
tricks.num_pages, tricks.__class__.num_pages
Out[57]: (20, 19)
我们注意到__class__没有受到影响。 从上面的例子中发现,在以后写代码时需要小心类属性和实例属性的作用域的范围。否则一不小心就会出现bug。