Python —类变量和实例变量
变量一词在python语言中其实叫法不算准确,因为其他语言都叫变量,所以很多编程者依旧叫变量,其实在Python叫对象和属性。
1、Python 一切皆对象
所以类也可以看作对象,类定义完成后,会在当前作用域中定义一个以类名为名字的类对象。
class DogClass():
print("This is a class")
pass
运行结果
This is a class
2、实例变量和类变量
实例变量是对于每个实例都独有的数据,类变量是一个类所有实例共享的属性和方法
class DogClass():
print("This is a class")
address = 'Beijing' # address就是一个类变量( class里def外,通过变量名能被赋值)
def __init__(self, name, age):
self.name = name ##类的设计时;def里通过self点运算变量名能被赋值
self.age = age
def disp_dog_info(self):
#使用class_name.attr_name的方式引用类变量
print('My dog\'s name is {}, {} yesrs old, come from {}.'.format(self.name, self.age,
DogClass.address))
def mod_dog_info(self, age_new, addr_new):
self.age = age_new
DogClass.address = addr_new #def里通过类对象即类名字的点运算变量名可被赋值
print("")
my_dog1 = DogClass('WangWang', 4)#实例化
my_dog2 = DogClass('PangPang', 3)#实例化
my_dog1.disp_dog_info()#
my_dog2.disp_dog_info()
print("")
my_dog1.mod_dog_info(1, 'Shanghai')
my_dog1.disp_dog_info()
my_dog2.disp_dog_info()
print("")
DogClass.address = 'ShenZhen' ##程序里:通过类对象(类名字)的点运算类名字也可被赋值
my_dog1.disp_dog_info()
my_dog2.disp_dog_info()
print("")
my_dog2.name = 'HuaHua' # 程序里;通过实例对象的点运算变量名可被赋值
my_dog2.disp_dog_info()
运行结果
This is a class
My dog's name is WangWang, 4 yesrs old, come from Beijing.
My dog's name is PangPang, 3 yesrs old, come from Beijing.
My dog's name is WangWang, 1 yesrs old, come from Shanghai.
My dog's name is PangPang, 3 yesrs old, come from Shanghai.
My dog's name is WangWang, 1 yesrs old, come from ShenZhen.
My dog's name is PangPang, 3 yesrs old, come from ShenZhen.
My dog's name is HuaHua, 3 yesrs old, come from ShenZhen.
结合上面的代码和注释看:
(1)DogClass是一个类,执行过类的定义后,DogClass也成为一个类对象
(2)address 是类变量,可以通过类对象的点运算变量名使用
(3)my_dog1 、my_dog2时类的实例化,即实例
(4) self.name、 self.age是实例变量,每个实例化对象的self.name 和self.age是不一样的。
3、类对象、类变量支持的操作:
(1)类对象使用:
实例化;使用instance_name = class_name()的方式实例化,实例化操作创建该类的实例。
变量引用;使用class_name.attr_name的方式引用类变量。
(2)类变量被赋值
- 类的设计里: 1、class里def外,通过变量名能被赋值;2、def里通过类对象即类名字的点运算变量名可被赋值(class_name.attr_name)
- 程序里:通过类对象(类名字)的点运算类名字也可被赋值
(3)实例对象使用
实例对象是类对象实例化的产物,实例对象仅支持一个操作:
- 变量引用;与类变量引用的方式相同,使用instance_name.attr_name的方式。
(4)实例对象变量使用
类的设计时;def里通过self点运算变量名能被赋值,不一定非在init里,其他已被调用的方法函数里也行
程序里;通过实例对象的点运算变量名可被赋值
综上:类变量是所有实例对象共享数据,有点像C语言的全局变量,修改后所有都修改
实例变量是具体某一个实例的,不同实例之间,实例变量没有关系
4、成员变量、局部变量、全局变量
1、成员变量=类变量、实例变量(实质一回事,叫法不同而已)
总结就是:格式是点运算的变量如(class_name.attr_name、instance_name.attr_name)
2、局部变量、全局变量看下面代码
max_num = 0 #全局变量
class ComClass():
def __init__(self,num1, num2):
self.num1 = num1
self.num2 = num2
def compare_max(self):
tmp = 0 #局部变量
if self.num1 >= self.num2:
tmp = self.num1
else:
tmp = self.num2
return tmp
com_num = ComClass(2,5)
max_num = com_num.compare_max()
print(max_num)
运行结果
5