实例属性相关操作

本贴最后更新于 1256 天前,其中的信息可能已经事过境迁

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

一、实例属性的定义

  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属性= 老张
    
    结论类实例可以访问(类属性实例属性)当类属性和实例属性同时存在的情况下变量名相同),实例属性的优先级高于类属性
    
    
3 回帖
请输入回帖内容 ...
  • xq

    整明白

  • csa1002259

    写的很详细啊,看的懂,感谢,海励老师?

  • luckyseven7

    感谢老师的分享