Python 的类其实是一个特殊的对象


Python 的类其实是一个特殊的对象
文章图片
Python中一切皆对象:
classAAA:定义的类属于类对象 。
obj1=AAA:属于实例对象 。
在程序运行时 , 类同样会被加载到内存 , 类是一个特殊的对象——类对象 。
类对象在内存中只有一份 , 使用一个类可以创建出很多个对象实例 。
除了封装实例的属性和方法外 , 类对象还可以拥有自己的属性和方法 。
通过‘类名.’的方式可以访问类的属性或者调用类的方法 。
一、类属性
类属性就是给类对象中定义的属性 , 通常用来记录与这个类相关的特征 , 类属性不会用于记录具体对象的特征 。
类属性的特点是 , 所有类的实例化对象都同时共享类属性 , 也就是说 , 类属性在所有实例化对象中是作为公用资源存在的 。
示例:

Python 的类其实是一个特殊的对象
文章图片

Python 的类其实是一个特殊的对象
文章图片
属性的获取机制
在Python中属性的获取存在一个向上查找机制 。
在python中 , 通过tool1.count的方式是怎么获取属性的值的?
首先 , 在Tool类中定义了类属性count和实例属性name , 我们要访问count属性 , 是通过Tool.count的方式进行访问 。 但是在Python中 , 除了可以用类名的方式来访问类属性 , 还可以使用对象变量的方式进行访问 。
假设我们实例化了Tool类 , 得到了对象tool1 , 在调用tool1.count的时候 , 首先是查找的对象tool1中的对象 , 如果没有找到 , 那么解释器就会向上寻找类中的count属性 , 如果找到就输出 , 如果没有找到就报错 。
这就是python中的属性向上查找机制 。
因此 , 要访问类属性有两种方式:
Python 的类其实是一个特殊的对象】类名.类属性
对象.类属性(不推荐)
注意:如果使用"对象.类属性=值"的赋值语句 , 只会给对象添加一个属性 , 而不会影响到类属性的值 。
示例:

Python 的类其实是一个特殊的对象
文章图片
二、类方法
类方法就是针对类对象定义的方法 , 在类方法内部可以直接访问类属性或者调用其他的类方法 。
Python类方法和实例方法相似 , 它最少也要包含一个参数 , 只不过类方法中通常将其命名为cls ,
Python会自动将类本身绑定给cls参数(注意 , 绑定的不是类对象) 。
语法如下:
类方法需要用修饰器@classmethod来标识 , 告诉解释器这是一个类方法 。
类方法的第一个参数应该是cls , 由哪一个类调用的方法 , 方法内的cls就是哪一个类的引用 , 这个参数和实例方法的第一个参数是self类似 。
和self一样 , cls参数的命名也不是规定的(可以随意命名) , 只是Python程序员约定俗称的习惯而已 。
通过‘类名.’的方式调用类方法 , 调用方法时 , 不需要传递cls参数 。
在方法内部 , 可以通过‘cls.’访问类的属性 , 也可以通过‘cls.’调用其他的类方法 。
示例:

Python 的类其实是一个特殊的对象
文章图片
三、静态方法
在开发时 , 如果需要在类中封装一个方法 , 这个方法既不需要访问实例属性或者调用实例方法 , 也不需要访问类属性或者调用类方法 , 这个时候 , 可以把这个方法封装成一个静态方法 。
静态方法 , 其实就是我们学过的函数 , 和函数唯一的区别是 , 静态方法定义在类这个空间(类命名空间)中 , 而函数则定义在程序所在的空间(全局命名空间)中 。
静态方法:由类调用;无默认参数 。
语法如下:
静态方法需要用修饰器@staticmethod来标识 , 告诉解释器这是一个静态方法 。 通过‘类名.’的方式调用静态方法 。
静态方法没有类似self、cls这样的特殊参数 , 因此Python解释器不会对它包含的参数做任何类或对象的绑定 。 也正因为如此 , 类的静态方法中无法调用任何类属性和类方法 。
示例:

Python 的类其实是一个特殊的对象
文章图片