Python 中的类是一个特殊的对象。python
Python 中一切皆对象:程序员
在程序运行时,类一样会被加载到内存,类是一个特殊的对象——类对象。函数
类对象在内存中只有一份,使用一个类能够建立出不少个对象实例。工具
除了封装实例的属性和方法外,类对象还能够拥有本身的属性和方法。学习
经过 '类名.' 的方式能够访问类的属性或者调用类的方法。code
1、类属性对象
类属性就是给类对象中定义的属性,一般用来记录与这个类相关的特征,类属性不会用于记录具体对象的特征。blog
类属性的特色是,全部类的实例化对象都同时共享类属性,也就是说,类属性在全部实例化对象中是做为公用资源存在的。图片
示例:
内存
class Tool(object): # 使用赋值语句定义类属性,记录全部工具对象的数量 count = 0 def __init__(self, name): self.name = name # 让类属性的值+1 Tool.count += 1 # 1. 建立工具对象 tool1 = Tool("斧头") tool2 = Tool("榔头") tool3 = Tool("水桶") # 2. 输出工具对象的总数 print(Tool.count) # 3
属性的获取机制
在 Python 中属性的获取存在一个向上查找机制。
在python中,经过 tool1.count 的方式是怎么获取属性的值的?
首先,在 Tool 类中定义了类属性 count 和 实例属性 name,咱们要访问 count 属性,是经过 Tool.count 的方式进行访问。可是在 Python中,除了能够用类名的方式来访问类属性,还能够使用对象变量的方式进行访问。
假设咱们实例化了 Tool 类,获得了对象 tool1,在调用 tool1.count 的时候,首先是查找的对象 tool1 中的对象,若是没有找到,那么解释器就会向上寻找类中的 count 属性,若是找到就输出,若是没有找到就报错。
这就是 python 中的属性向上查找机制。
所以,要访问类属性有两种方式:
注意:若是使用"对象.类属性 = 值"的赋值语句,只会给对象添加一个属性,而不会影响到类属性的值。
示例:
#Python学习交流群:778463939 class Tool(object): # 使用赋值语句定义类属性,记录全部工具对象的数量 count = 0 def __init__(self, name): self.name = name # 让类属性的值+1 Tool.count += 1 # 1. 建立工具对象 tool1 = Tool("斧头") tool2 = Tool("榔头") tool3 = Tool("水桶") # 2. 输出工具对象的总数 tool3.count = 99 print(tool3.count) # 99 print(Tool.count) # 3
2、类方法
类方法就是针对类对象定义的方法,在类方法内部能够直接访问类属性或者调用其余的类方法。
Python 类方法和实例方法类似,它最少也要包含一个参数,只不过类方法中一般将其命名为 cls,
Python 会自动将类自己绑定给 cls 参数(注意,绑定的不是类对象)。
语法以下:
@classmethod def 类方法名(cls): pass
类方法须要用修饰器 @classmethod 来标识,告诉解释器这是一个类方法。
类方法的第一个参数应该是 cls,由哪个类调用的方法,方法内的 cls 就是哪个类的引用,这个参数和实例方法的第一个参数是 self 相似。
和 self 同样,cls 参数的命名也不是规定的(能够随意命名),只是 Python 程序员约定俗称的习惯而已。
经过 '类名.' 的方式调用类方法,调用方法时,不须要传递 cls 参数。
在方法内部,能够经过 'cls.' 访问类的属性,也能够经过 'cls.' 调用其余的类方法。
示例:
#Python学习交流群:778463939 @classmethod def show_tool_count(cls): """显示工具对象的总数""" print("工具对象的总数 %d" % cls.count)
3、静态方法
在开发时,若是须要在类中封装一个方法,这个方法既不须要访问实例属性或者调用实例方法,也不须要访问类属性或者调用类方法,这个时候,能够把这个方法封装成一个静态方法。
静态方法,其实就是咱们学过的函数,和函数惟一的区别是,静态方法定义在类这个空间(类命名空间)中,而函数则定义在程序所在的空间(全局命名空间)中。
静态方法:由类调用;无默认参数。
语法以下:
@staticmethod def 静态方法名(): pass
静态方法须要用修饰器 @staticmethod 来标识,告诉解释器这是一个静态方法。经过 '类名.' 的方式调用静态方法。
静态方法没有相似 self、cls 这样的特殊参数,所以 Python 解释器不会对它包含的参数作任何类或对象的绑定。也正由于如此,类的静态方法中没法调用任何类属性和类方法。
示例:
class Dog(object): @staticmethod def run(): # 不访问实例属性/类属性 print("小狗要跑...") # 经过类名.调用静态方法 - 不须要建立对象 Dog.run()