前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python - 类中的对象与属性

Python - 类中的对象与属性

作者头像
为为为什么
发布2022-08-04 14:59:22
2.6K0
发布2022-08-04 14:59:22
举报
文章被收录于专栏:又见苍岚

本文整理类中对象与属性(变量)相关知识。

类对象与实例对象

建立测试类:

代码语言:javascript
复制
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的方式
代码语言:javascript
复制
# 类对象
print(Test)

# 实例对象
class_instance = Test()

>>>
<class '__main__.Test'>
<__main__.Test object at 0x00000127715B4128>

类变量与实例变量

建立测试类:

代码语言:javascript
复制
class Test:
    var_of_class = 'Class Var'
    def __init__(self):
        self.var_of_instance = 'Instance Var'

类变量

可由类对象引用 由所有实例共享

代码语言:javascript
复制
# 类对象引用类变量
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

实例变量

由实例对象引用 仅在当前实例保存

代码语言:javascript
复制
# 实例变量
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

类对象不能引用实例变量:

代码语言:javascript
复制
# 类对象不能引用实例变量
print(Test.var_of_instance)
>>> 报错!
type object 'Test' has no attribute 'var_of_instance'

属性绑定

建立测试类:

代码语言:javascript
复制
class Test():
    var_of_class = 'Class Var'
    def __init__(self):
        self.var_of_instance = 'Instance Var'

在定义、使用类、实例对象属性过程中,其实涉及两个过程:

  • 类属性绑定
  • 实例属性绑定

使用绑定一词事实上更加确切,可以理解为属性并不是属于类或实例的,Python中一切皆对象,每个属性也都是一个个现货鲜活的对象,之所以这些对象被称之为、用作于属性,是因为我们将这部分对象绑在了类对象可使用的属性名称上; 换一种说法,对象就是对象,而世上本没有属性,当对象被绑定在类/实例上,对象也就成了类/实例的属性。 因此绑定属性,首先需要有一个对象才行。

类属性绑定

Python作为动态语言,类对象和实例对象都可以在运行时绑定任意属性,因此类属性绑定有两种时机:

  • 编译类时(写在类中的类属性)
  • 运行时
代码语言:javascript
复制
# 定义时绑定类属性
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

实例属性绑定

实例属性绑定也发生在两个时机:

  • 实例生成时
  • 运行时
代码语言:javascript
复制
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

属性引用

上文中对属性的使用事实上都是在引用类对象或实例对象中的属性。 需要特别说明的是实例对象的属性引用冲突的问题,当类中存在同名的实例属性与类属性时:

  • 由于类对象无法访问实例属性,因此对类对象的属性引用没有影响
  • 实例属性有权访问二者,实现上会优先引用实例级的属性,即同名的类属性会被覆盖
代码语言:javascript
复制
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下载。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020年6月20日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 类对象与实例对象
    • 类对象
      • 实例对象
      • 类变量与实例变量
        • 类变量
          • 实例变量
          • 属性绑定
            • 类属性绑定
              • 实例属性绑定
              • 属性引用
              • 获取源码
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档