实例属性相关操作

前言:在学习类和对象的时候类属性和实例属性是绕不开的,上一篇文章讲了类属性,接下来我们就讲一下实例属性,希望这篇博客对大家有帮助。

一、实例属性的定义

  1. 定义在类的初始化函数(def __init__())中的变量就叫实例属性
    class Dog:
        def __init__(self,age): #此处的age需要在类实例化的时候传进来
            self.name = "老王" #实例属性,写死的方式定义
            self.age = age    #实例属性,通过类初始化参数定义
    
    if __name__ == '__main__':
        cl = Dog(age=20) # 类实例化,并传递参数给初始化函数
    
    

二、实例属性的访问

  1. 实例属性访问分为:类内部访问、类外部访问
  2. 类内部访问
    class Dog:
        def __init__(self,age):
            self.name = "老王"
            self.age = age
    
        def test_01(self):
            print(self.name) # 类内部访问实例属性
    
    if __name__ == '__main__':
        cl = Dog(age=20)
        cl.test_01()
    输出:
    老王
    
  3. 类外部访问
    class Dog:
        def __init__(self,age):
            self.name = "老王"
            self.age = age
    
    if __name__ == '__main__':
        cl = Dog(age=20)
        print(cl.name) # 类外部访问实例属性
    输出:
    老王
    
    

三、实例属性的修改

  1. 实例属性为不可变类型
    class Dog:
        def __init__(self,age):
            self.name = "老王"
            self.age = age
    
    if __name__ == '__main__':
        cl = Dog(age=20)
        print("修改之前实例属性id = ",id(cl.name))
        print("修改之前实例属性 = ",cl.name)
        cl.name = "老张"
        print("修改后实例属性id = ",id(cl.name))
        print("修改后实例属性 = ",cl.name)
    输出:
    修改之前实例属性id =  4521110760
    修改之前实例属性 =  老王
    修改后实例属性id =  4521111024
    修改后实例属性 =  老张
    
    结论:当实例属性为不可变类型,对实例属性进行修改,实际上只是改变了实例属性的引用地址,并未对齐进行修改
    
  2. 实例属性为可变类型
    class Dog:
        def __init__(self,age):
            self.name = ["老王"]
            self.age = age
    
    if __name__ == '__main__':
        cl = Dog(age=20)
        print("修改之前实例属性id = ",id(cl.name))
        print("修改之前实例属性 = ",cl.name)
        cl.name.append("老张")
        print("修改后实例属性id = ",id(cl.name))
        print("修改后实例属性 = ",cl.name)
    输出:
    修改之前实例属性id =  4362344712
    修改之前实例属性 =  ['老王']
    修改后实例属性id =  4362344712
    修改后实例属性 =  ['老王', '老张']
    
    结论:当实例属性为可变类型,可以进行修改
    

四、属性优先级

  1. 当类属性与实例属性同时存在且同名的时候,去访问该属性
    class Dog:
        name = "老王"
        def __init__(self):
            self.name = "老张"
    
        def test_01(self):
            print("类内部访问name属性id=",id(self.name))
            print("类内部访问name属性=",self.name) #类内部访问name属性
    
    if __name__ == '__main__':
        cl = Dog()
        cl.test_01() #调用test_01方法,在类内部对实例属性进行访问
        print("类外部访问name属性id=",id(cl.name))
        print("类外部访问name属性=",cl.name)
    输出:
    类内部访问name属性id= 4388310512
    类内部访问name属性= 老张
    类外部访问name属性id= 4388310512
    类外部访问name属性= 老张
    
    结论:类实例可以访问(类属性、实例属性),当类属性和实例属性同时存在的情况下(变量名相同),实例属性的优先级高于类属性
    
    
回帖
请输入回帖内容 ...