本文最后更新于:2024年5月7日 下午
本文整理类中对象与属性(变量)相关知识。
类对象与实例对象
建立测试类:
1 2 3 4 class Test : var_of_class = 'Class Var' def __init__ (self ): self.var_of_instance = 'Instance Var'
类对象
建立类进行编译后则形成了类对象,类对象仅支持两个操作:
实例化:使用instance_name = class_name()
的方式实例化,实例化操作创建该类的实例。
属性引用:使用class_name.attr_name
的方式引用类属性。
实例对象
类对象实例化得到实例对象,实例对象仅支持一个操作:
属性引用;与类对象属性引用的方式相同,使用instance_name.attr_name
的方式
1 2 3 4 5 6 7 8 9 print (Test) class_instance = Test() >>> <class '__main__.Test' > <__main__.Test object at 0x00000127715B4128 >
类变量与实例变量
建立测试类:
1 2 3 4 class Test : var_of_class = 'Class Var' def __init__ (self ): self.var_of_instance = 'Instance Var'
类变量
可由类对象引用
由所有实例共享
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 print (f'类对象引用类变量 :{Test.var_of_class} ' ) class_instance_1 = Test() class_instance_2 = Test()print (f'实例对象1引用类变量 :{class_instance_1.var_of_class} ' )print (f'实例对象2引用类变量 :{class_instance_2.var_of_class} ' ) Test.var_of_class = 'Changed Class Var' print (f'实例对象1引用类变量 :{class_instance_1.var_of_class} ' )print (f'实例对象2引用类变量 :{class_instance_2.var_of_class} ' ) >>> 类对象引用类变量 :Class Var 实例对象1 引用类变量 :Class Var 实例对象2 引用类变量 :Class Var 实例对象1 引用类变量 :Changed Class Var 实例对象2 引用类变量 :Changed Class Var
实例变量
由实例对象引用
仅在当前实例保存
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 class_instance_1 = Test() class_instance_2 = Test()print (f'实例对象1实例变量 :{class_instance_1.var_of_instance} ' )print (f'实例对象2实例变量 :{class_instance_2.var_of_instance} ' ) class_instance_1.var_of_instance = 'changed instance var' print (f'修改实例对象1后实例对象1实例变量 :{class_instance_1.var_of_instance} ' )print (f'修改实例对象1后实例对象2实例变量 :{class_instance_2.var_of_instance} ' ) >>> 实例对象1 实例变量 :Instance Var 实例对象2 实例变量 :Instance Var 修改实例对象1 后实例对象1 实例变量 :changed instance var 修改实例对象1 后实例对象2 实例变量 :Instance Var
类对象不能引用实例变量:
1 2 3 4 print (Test.var_of_instance)>>> 报错!type object 'Test' has no attribute 'var_of_instance'
属性绑定
建立测试类:
1 2 3 4 class Test (): var_of_class = 'Class Var' def __init__ (self ): self.var_of_instance = 'Instance Var'
在定义、使用类、实例对象属性过程中,其实涉及两个过程:
使用绑定
一词事实上更加确切,可以理解为属性并不是属于类或实例的,Python中一切皆对象,每个属性也都是一个个现货鲜活的对象,之所以这些对象被称之为、用作于属性,是因为我们将这部分对象绑在了类对象可使用的属性名称上;
换一种说法,对象就是对象,而世上本没有属性,当对象被绑定在类/实例上,对象也就成了类/实例的属性 。
因此绑定属性,首先需要有一个对象才行。
类属性绑定
Python作为动态语言,类对象和实例对象都可以在运行时绑定任意属性,因此类属性绑定有两种时机:
1 2 3 4 5 6 7 8 9 print (f'定义时绑定类属性:{Test.var_of_class} ' ) Test.var_of_class_defined_during_running = 'a long var of class' print (f'运行时绑定类属性:{Test.var_of_class_defined_during_running} ' ) >>> 定义时绑定类属性:Changed Class Var 运行时绑定类属性:a long var of class
实例属性绑定
实例属性绑定也发生在两个时机:
1 2 3 4 5 6 7 8 9 10 class_instance = Test()print (f'实例生成时绑定的实例属性:{class_instance.var_of_instance} ' ) class_instance.var_of_instance = 'defined during running' print (f'实例运行时绑定的实例属性{class_instance.var_of_instance} ' ) >>> 实例生成时绑定的实例属性:Instance Var 实例运行时绑定的实例属性: defined during running
属性引用
上文中对属性的使用事实上都是在引用类对象或实例对象中的属性。
需要特别说明的是实例对象的属性引用冲突的问题,当类中存在同名的实例属性与类属性时:
由于类对象无法访问实例属性,因此对类对象的属性引用没有影响
实例属性有权访问二者,实现上会优先引用实例级的属性,即同名的类属性会被覆盖
1 2 3 4 5 6 7 8 class_instance = Test() class_instance.var_of_class = 'instance var with a same name of a class var' print (f'类对象引用冲突属性:{Test.var_of_class} ' )print (f'实例对象引用冲突属性:{class_instance.var_of_class} ' ) >>> 类对象引用冲突属性:Changed Class Var 实例对象引用冲突属性:instance var with a same name of a class var
获取源码
文中测试环境与所有源码可在Github 下载。
文章链接:
https://www.zywvvd.com/notes/coding/python/python-class-var/python-class-var/