类对象和实例对象都可以分别看做python的命名空间。创建类的实例对象时,分为两步,先去调用__new__方法创建实例对象,定义一个命名空间;再去调用__init__方法对申请的命名空间进行初始化,其中的参数self指向新创建的实例对象;
类对象中有类属性和方法(类方法、静态方法、实例方法),类可以实例化不同的对象,即为实例对象,实例对象中有实例属性。
类对象的一些公共属性封装为类属性,不同的实例对象封装各自的实例属性。
类访问类属性,实例对象访问实例属性。如果实例对象需要访问重构类属性,可以使用实例对象.__class__.类属性=新的属性值。
实例对象可以调用实例方法、类方法和静态方法,但类对象只能调用类方法和静态方法。
类方法前会使用装饰器:@classmethod,传入能表示此类对象的参数,如,cls;
实例方法就是一个普通方法,传入能表示实例对象的参数,固定传入self;
调用实例方法会传入对应的实例对象引用,调用类方法会传入类对象引用,类方法和实例方法本质区别就是传入的引用不同,方法指向的对象不同,那也就可以各自在方法里修改对应的实例属性和类属性。
为什么需要静态方法呢?某些操作和类对象、实例对象均无关,此时就能定一个辅助函数。如果定义在类外,直接调用方法也可以,但如果一个模块下有多个类,需要分别实现各自的辅助函数,这个时候首先被定义的函数功能失效,默认仅生效最新定义的那个函数,就无法确定这样的一个辅助函数,实际是为哪个类所调用。那也就是说,一个方法不需要传如实例对象和类对象的引用,又想归属到类里面,在方法前使用装饰器:@staticmethod,就可以定义一个静态方法。