前言:在学习类和对象的时候类属性和实例属性是绕不开的,上一篇文章讲了类属性,接下来我们就讲一下实例属性,希望这篇博客对大家有帮助。
一、实例属性的定义
-
定义在类的初始化函数(
def __init__()
)中的变量就叫实例属性class Dog: def __init__(self,age): #此处的age需要在类实例化的时候传进来 self.name = "老王" #实例属性,写死的方式定义 self.age = age #实例属性,通过类初始化参数定义 if __name__ == '__main__': cl = Dog(age=20) # 类实例化,并传递参数给初始化函数
二、实例属性的访问
-
实例属性访问分为:类内部访问、类外部访问
- 类内部访问
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() 输出: 老王
- 类外部访问
class Dog: def __init__(self,age): self.name = "老王" self.age = age if __name__ == '__main__': cl = Dog(age=20) print(cl.name) # 类外部访问实例属性 输出: 老王
三、实例属性的修改
-
实例属性为不可变类型
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 修改后实例属性 = 老张 结论:当实例属性为不可变类型,对实例属性进行修改,实际上只是改变了实例属性的引用地址,并未对齐进行修改
-
实例属性为可变类型
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 修改后实例属性 = ['老王', '老张'] 结论:当实例属性为可变类型,可以进行修改
四、属性优先级
-
当类属性与实例属性同时存在且同名的时候,去访问该属性
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属性= 老张 结论:类实例可以访问(类属性、实例属性),当类属性和实例属性同时存在的情况下(变量名相同),实例属性的优先级高于类属性
欢迎来到testingpai.com!
注册 关于