Python中的类变量和成员变量
类变量
-
定义
在类里面定义,且不位于构造或者成员函数里面,同时没有" self. " 的前缀;或者在类外定义,用 类名.类变量名 来新增加类变量。
-
使用
两种使用方法: (1)类名.类变量名(如下的 Test.a) (2)类的实例对象.类变量名(如下的 T.a)
exp:
class Test: a = 1 ### 类变量 def __init__(self): self.member = 2 def indoor(self, people): self.member = people T = Test() print(Test.a) ## 使用方法(1) print(T.a) ## 使用方法(2) >> 1 >> 1
-
作用范围
类变量可以通过 使用方法(1)进行全局的修改(如操作1所示)
类变量通过 使用方法(2)只能进行局部的修改(如操作2所示)
也就是说 刚开始Test.a 和T1.a 还有 T2.a 都是指向同一地址,Test.a的修改只是修改地址里的值,而没有修改地址,而直接修改实例化对象(如T1.a 或者 T2.a)的数值,会让其实例对象的值指向新的内存空间,并且不再受到类变量Test.a的影响
exp:
class Test: a = 1 ### 类变量 def __init__(self): self.member = 2 def indoor(self, people): self.member = people T1 = Test() T2 = Test() print(T1.a) print(T2.a) print(Test.a) >> 1 >> 1 >> 1 ############ 操作1 ########### Test.a = 1000 print(T1.a) print(T2.a) print(Test.a) >> 1000 >> 1000 >> 1000 ############ 操作2 ########### T1.a = 2000 print(T1.a) print(T2.a) print(Test.a) >> 2000 >> 1000 >> 1000
成员变量(实例变量)
-
定义
在构造函数中 使用 “self.” 作为前缀的变量;或者在类的成员函数中使用“self.” 作为前缀的变量。其中前面一种定义在初始化类的时候即类实例创建的时候就产生了,而后面的定义只有当类的实例对象调用该成员函数时才被创建。
-
使用
在类实例化时或者在类实例调用包含有成员变量的函数时,需要给成员变量赋值。同时成员变量的使用只能使用 实例对象.成员变量名的形式(如 T.member; T.title),而不能使用类名来调用。
exp:
class Test: a = 1 def __init__(self): self.member = 2 ### 构造函数中的成员变量 def indoor(self): self.title = 3 ### 成员函数中的成员变量 T = Test() print(T.member) ## 成员变量的调用 T.indoor() ## 先调用含有成员变量的函数 print(T.title) ## 成员变量的调用 >> 2 >> 3
-
作用范围
成员变量在不同的类实例对象之间不是全局的。对于一个类实例对象,其成员变量可以修改。也就说,一个类实例对象拥有一块存储区域用来存放成员变量,且成员变量的值可以修改,各个类实例对象的存储区不重叠且不互通。
exp:
class Test: a = 1 def __init__(self): self.member = 2 def indoor(self): self.title = 3 T1 = Test() T2 = Test() ### 通过不同的类实例对象对于同一个成员变量进行修改 ### print(T1.member) T2.member = 5 print(T1.member) print(T2.member) ### 通过不同的类实例对象对于同一个成员变量进行修改 ### T1.indoor() print(T1.title) T2.indoor() T2.title = 7 print(T1.title) print(T2.title) >> 2 >> 2 >> 5 >> 3 >> 3 >> 7
局部变量
-
定义
在成员函数的内部定义变量,和普通的函数的局部变量概念一致
-
使用
和python中其他的局部变量的使用方法一致
-
作用范围
只作用于该函数的内部,与普通函数的局部变量的作用域一致
exp:
class Test: a = 1 def __init__(self): self.member = 2 def indoor(self): total = 4 ## 局部变量;只在indoor函数内有效 self.title = 3 T = Test() T.indoor() print(T.total) ## 访问不到局部变量 >> Traceback (most recent call last): File "main.py", line 10, in <module> print(T.total) AttributeError: Test instance has no attribute 'total'
还有一件事
class Test:
a = 1
self.b = 2 ## self.b 不能定义在最外层的 self只有在类的方法中才会有 指的是类实例对象本身 所以其算不上是成员变量还是类变量
def __init__(self):
self.member = 2
def indoor(self):
total = 4
self.title = 3
T = Test()
print(T.b)
>> Traceback (most recent call last):
File "main.py", line 1, in <module>
class Test(self,c):
NameError: name 'self' is not defined