主要内容 #
1. 类中变量的类型 #
无论是类属性还是类方法,都无法像普通变量或者函数那样,在类的外部直接使用它们。
我们可以将类看做一个独立的空间,则类属性其实就是在类体中定义的变量,类方法是在类体中定义的函数。
前面章节提到过,在类体中,根据变量定义的位置不同,以及定义的方式不同,类属性又可细分为以下 3 种类型:
- 1. 类体中,所有函数之外:此范围定义的变量,称为类属性或类变量;
- 2. 类体中,所有函数内部:以“self.变量名”的方式定义的变量,称为实例属性或实例变量;
- 3. 类体中,所有函数内部:以“变量名=变量值”的方式定义的变量,称为局部变量。
2. 类变量(类属性) #
类变量指的是在类中,但在各个类方法外定义的变量。
class Person: #定义一个Person类 ''' 这是一个Person类的定义 ''' def __init__(self): # __init__函数 print("自动调用了构造方法") name = '某某' #类变量的定义 Someone_1 = Person() print(Person.name) # 以 “类名.变量” 的方式打印 print(Someone_1.name) # 以 “类对象.变量” 的方式打印
从结果来看,类变量的特点是:
所有类的实例化对象都同时共享类变量,即,类变量在所有实例化对象中是作为公用资源存在的。
如果修改了公用资源,则所有对象的变量都一起改变。
比如:
Person.name = '小明' print(Person.name) #结果输出‘小明’ print(Someone_1.name) #结果输出‘小明’
而如果只修改了对象的属性,则不会对类变量造成任何影响。
比如:
Someone_1.name = '小明' print(Person.name) #结果输出‘某某’ print(Someone_1.name) #结果输出‘小明’
3. 实例变量(实例属性) #
实例变量指的是在任意类方法内部,以“self.变量名”的方式定义的变量。
其特点是只作用于调用方法的对象。
注意,实例变量只能通过对象名访问,无法通过类名访问。
class Person: #定义一个Person类 ''' 这是一个Person类的定义 ''' def __init__(self, name): # __init__函数 self.name = name #实例属性,表示定义的实例有自己的name def mysay(self): self.say = "I am instance" # 实例属性也可以定义在实例方法中 Someone_1 = Person(name="小明") print(Someone_1.name) # 以类对象.变量的方式打印 Someone_1.mysay() # 为了感知实例方法内的实例属性,需要显式的调用实例方法 print(Someone_1.say) # 以类对象.变量的方式打印。思考:如果没有调用mysay()函数,此行会不会报错 #print(Person.name) # 通过类名访问实例变量,会报错
从结果来看,实例变量的特点是每个实例特有的变量。
并且实例变量不仅可以定义在__init__方法里,也可以定义在类中的其它实例方法中。
但是只有调用了相应的类实例方法的类对象,才能包含实例方法中的实例变量
4. 局部变量 #
除了实例变量,类方法中还可以定义局部变量。
和前者不同,局部变量直接以“变量名=值”的方式进行定义
class Person: #定义一个Person类 ''' 这是一个Person类的定义 ''' def __init__(self, name): # __init__函数 self.name = name #实例属性,表示定义的实例有自己的name def mysay(self): self.say = "I am instance" # 实例属性也可以定义在实例方法中 def change_name(self): name = self.name + ' Junior' # 此行中,等号左边的变量name属于局部变量 print("局部变量name为:", name) Someone_1 = Person(name="大雄") print('实例变量Someone_1.name为:',Someone_1.name) # 实例变量 Someone_1.change_name() print('调用change_name方法之后:') print('实例变量Someone_1.name为:',Someone_1.name) # 实例变量未发生任何修改
通常情况下,定义局部变量是为了所在类方法功能的实现。
需要注意的一点是,局部变量只能用于所在函数中,函数执行完成后,局部变量会被自动销毁。
5. 小结 #
- 类中的变量通常有三种:类变量,实例变量和局部变量
- 类变量是类特有的变量,且所有实例共享该变量值,类和实例都可访问类变量
- 实例变量是实例特有的变量,仅所属实例进行访问
- 局部变量只能在函数内定义,且主要用于功能实现,函数执行完之后,局部变量也会销毁
习题 #
- 无