1、类变量与实例变量
类变量是一种在定义类的时候定义,
#!/usr/bin/env python3 # -*- coding: utf-8 -*- class Animal: name = "动物"
类变量和实例变量的区别,就是类变量不需要实例化就你能直接使用,相当于绑定在类上,而不是绑定在实例上,例如:
#!/usr/bin/env python3 # -*- coding: utf-8 _*_ class Animal: name = "动物" print (Animal.name)
执行结果如下:
动物
但是类变量在实例中也是可以被调用的。例如:
#!/usr/bin/env python3 # _*_ coding: utf-8 _*_ class Animal: name = "动物" dog = Animal() cat = Animal() print (dog.name) print (cat.name) Animal.name = "哺乳类动物" print (dog.name) print (cat.name)
执行结果如下:
动物
动物
哺乳类动物
哺乳类动物
但是要注意,实例不能修改类变量,如果实例对类变量进行修改,Python解释器会新建一个同名的成员变量来代理实例中的类变量。
2、静态方法与类方法
定义静态方法:
#!/usr/bin/env python3 # -*- coding: utf-8 -*- class Animal: name = "动物" @staticmethod def play(): print ("playing") dog = Animal Animal.play() print ("-" * 10) dog.play()
执行结果:
playing
----------
playing
就如着例子写的,定义静态方法的语法就是在定义函数的上面一行(不能有空行) 添加一句”@staticmethod“。 这是一句装饰语法。静态方法不在有第一个默认参数”self”,所以静态方法本身也不能调用成员变量和成员方法,静态方法不需要实例化之后使用,是和类变量一样直接使用即可,其他的和一般的函数内有任何区别。
2.2 类方法
类方法,顾名思义就是好该方法绑定在定义的类上面,而不是绑定在实例上。
定义类方法:
#!/usr/bin/env python3 # -*- coding: utf-8 -*- class Animal: name = "动物" @classmethod def play(cls): print (cls.name, "playing") Animal.play()
执行结果:
动物 playing
从这个例子,可以看到,定义类方法和静态方法有点类似,是在定义类方法的前一行(不能有空行) 添加一句装饰语法“@classmethod”。和静态方法不同的是,类方法和成员方法一样都有一个初始的参数,但是这个参数不同于成员方法,成员方法的的第一个参数指向的是实例,而类方法指向则是定义的类本身,所以类方法可以读取和修改类变量。