跳至正文
View Categories

1 min read

主要内容 #

  • 类中变量的类型
  • 类变量(类属性)
  • 实例变量(实例属性)
  • 局部变量
  • 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. 小结 #

    • 类中的变量通常有三种:类变量,实例变量和局部变量
    • 类变量是类特有的变量,且所有实例共享该变量值,类和实例都可访问类变量
    • 实例变量是实例特有的变量,仅所属实例进行访问
    • 局部变量只能在函数内定义,且主要用于功能实现,函数执行完之后,局部变量也会销毁

    习题 #