成员变量与类变量(静态成员变量)
定义在类中的变量我们又分为成员变量以及类变量(或者称静态成员变量)
类变量定义在类中,且在函数体之外,类变量通常不作为实例变量使用,类变量在整实例化的过程中是公用的。
成员变量:定义在方法中且通过self绑定在实例上的变量,只作用于当前实例。
成员变量与类变量的区别:
-
定义的位置不同,类变量直接定义在类中变量,成员变量是定义在方法绑定在self身上的变量
-
成员变量使用对象来访问,类变量使用类名来访问
-
类变量主要给我们的类使用的.
调用类变量的时候,建议使用类名来进行调用.
但若执意使用对象来进行调用,它也不会报错. -
成员变量是专门给对象使用的,不能使用类名来进行调用.
-
在内存中出现的时机不同【类变量随着类的加载而出现,成员变量随着对象的创建而出现】
-
优先级不同,使用对象调用的时候优先使用成员变量
演示1 : 定义的位置
class Student(object):
#类变量
classname = "1802"
def __init__(self):
#成员变量
self.name = "zhang"
self.classname = "1888" # 这个也是成员变量,只不过与类变量同名
演示2 : 变量的调用
1 成员变量中没有和类变量同名
class Student(object):
#类变量
classname = "1802"
def __init__(self):
#成员变量
self.name = "zhang"
#self.classname = "1888" # 这个也是成员变量,只不过与类变量同名 (此时注释该变量)
# 成员变量通过实例化对象调用
stu = Student()
# 调用成员变量
print(stu.name)
# 打印结果 'zhang'
#类变量的调用
print(Student.classname) # 通过类名调用类变量
print(stu.classname) # 可以通过对象调用类变量
# 打印结果
1802
1802
2 成员变量和类变量同名
class Student(object):
#类变量
classname = "1802"
def __init__(self):
#成员变量
self.name = "zhang"
self.classname = "1888" # 这个也是成员变量,只不过与类变量同名
# 成员变量通过实例化对象调用
stu = Student()
# 调用成员变量
print(stu.name)
# 打印结果 'zhang'
#类变量的调用
print(Student.classname)
# 打印结果 1802
print(stu.classname)
# 打印结果 1888
所以,当成员变量不存在,并且类变量存在的时候,在使用对象调用属性的时候,会调用类变量;当成员变量和类变量同时存在,且同名时,使用对象调用属性,优先调用成员变量
演示3 :更改变量的值
1 成员变量中没有和类变量同名
class Student(object):
#类变量
classname = "1802"
def __init__(self):
#成员变量
self.name = "zhang"
#self.classname = "1888" # 这个也是成员变量,只不过与类变量同名 (此时注释该变量)
stu = Student()
#更改变量的值
#通过类名来更改类变量的值
Student.classname = "1804"
print(Student.classname)
# 打印结果 1804
#通过对象更改类变量的值
stu.classname = "1803"
print(stu.classname)
# 打印结果 1803
#创建一个新的变量
stu2 = Student()
print(stu2.classname)
#"1804"
print(Student.classname)
#"1804"
2 成员变量和类变量同名
class Student(object):
#类变量
classname = "1802"
def __init__(self):
#成员变量
self.name = "zhang"
self.classname = "1888" # 这个也是成员变量,只不过与类变量同名
stu = Student()
#更改变量的值
#通过类名来更改类变量的值
Student.classname = "1804"
print(Student.classname)
# 打印结果 1804
#通过对象更改类变量的值
stu.classname = "1803"
print(stu.classname)
# 打印结果 1803
#创建一个新的变量
stu2 = Student()
print(stu2.classname)
#"1888"
print(Student.classname)
#"1804"
所以: 通过对象来更改成员变量或者是类变量的值的时候,只是改变的当前对象的值,而通过类名来更改类变量的值的时候,更改的则是类变量的初始值。
结论:
- 当类变量与成员变量同名时,使用对象来调用时,默认调用的是成员变量的值
- 当成员变量不存在,并且类变量存在的时候,在使用对象调用属性的时候,会调用类变量
- 成员变量只能通过对象来调用,而类变量不但可以通过对象调用,还可以通过类名来调用
- 通过对象来更改成员变量或者是类变量的值的时候,只是改变的当前对象的值,而通过类名来更改类变量的值的时候,更改的则是类变量的初始值。
什么时候使用成员变量?
什么时候使用类变量?
当初始化对象的时候,需要使用到的参数,把它定义成成员变量,
类变量大多数时候,无需改变的量,可以把它定义成类变量.