Python - 面向对象编程 - 类变量、实例变量/类属性、实例属性

什么是对象和类

什么是 Python 类、类对象、实例对象

类变量、实例变量/类属性、实例属性

前言

只是叫法不一样

实例属性 = 实例变量

类属性 = 类变量

个人认为叫属性更恰当

类属性和实例属性区别

  • 类属性,所有实例对象共享该属性
  • 实例属性,属于某一个实例对象的属性,用于描述具体的对象

从实际栗子了解类属性、实例属性

有一个表格,四个常见的明星

姓名

年龄

周润发

58

成龙

55

刘德华

53

周星驰

54

总结一下

  • 四个人归类为明星
  • 每个明星都有两个属性:姓名、年龄
  • 明星这个群体具有一个属性:明星数量,在这张表是 4
  • 姓名和年龄等属性是用来描述具体的一个对象
  • 明星的数量是用于描述明星这个类别的

使用面向对象编程思想来总结的话

  • 周润发、成龙、刘德华、周星驰都是实例对象
  • 他们都属于明星,明星是类
  • 属于实例对象的属性有:姓名、年龄,所以也叫实例属性
  • 属于明星类的属性有:数量,所以也叫类属性

类里面的三种类型变量

  • 在所有方法之外定义的变量,称为类属性/类变量
  • 在方法内部,通过 方式定义的变量,称为实例属性/实例变量

self.变量名

  • 在方法内部,通过 方式定义的变量,称为局部变量

变量名=变量值

类属性

类属性在类中的定义

class 类名:
    类属性1 = 值
    类属性2 = 值

    def func(self): 
        ...        

类属性、类方法注意点

  • 无论是类属性还是类方法,都无法像普通变量或者函数那样,在类的外部直接使用它们(类方法后面详解)
  • 可以将类看做一个独立的空间,类属性其实也是在类体中定义的变量,类方法是在类体中定义的函数
  • 需要通过类对象/实例对象来调用类属性 (类方法后面详解)

ClassName.classProperty

类属性的栗子

# 类属性
class PoloBlog:
    # 这就是在所有方法之外 下面定义了 2 个类变量
    name = "小菠萝测试笔记"
    blog = "https://www.cnblogs.com/poloyy/"

# 通过类名调用类属性
print(PoloBlog.name)
print(PoloBlog.blog)


# 输出结果
小菠萝测试笔记
https://www.cnblogs.com/poloyy/

通过 Pycharm 的代码联想,可以看到 blog、name、__doc__ 三个类属性

类属性的调用方式

有两种

  • 直接通过类名调用
  • 也可以通过类的实例对象调用

调用类属性的栗子

# 调用类属性的两种方式
class PoloBlog:
    # 这就是在所有方法之外 下面定义了 2 个类变量
    name = "小菠萝测试笔记"
    blog = "https://www.cnblogs.com/poloyy/"


# 通过类名直接调用
print(PoloBlog.name)
print(PoloBlog.blog)

# 修改类属性
PoloBlog.name = "blogyuan"
PoloBlog.blog = "https://www.cnblogs.com/"

# 通过实例对象调用修改后的类属性
poloBlog = PoloBlog()
print(poloBlog.name)
print(poloBlog.blog)


# 输出结果
小菠萝测试笔记
https://www.cnblogs.com/poloyy/
blogyuan
https://www.cnblogs.com/

通过类名修改类属性的值,会影响所有的实例化对象

实例对象修改类属性

# 修改类属性
poloBlog.name = "小菠萝回来了"

# 再看看类对象调用修改后的类属性
print(PoloBlog.name)
print(poloBlog.name)


# 输出结果
blogyuan
小菠萝回来了

  • 会发现, 仍然返回之前的值,而 实例对象.name 会返回修改的值

类名.name

  • 原因: 本质上并不是修改类属性的值,而是在定义一个新的实例属性(下面详解)

实例对象.name

动态添加类属性

PoloBlog.age = 24
print(PoloBlog.age)
print(poloBlog.age)


# 输出结果
24
24

  • age 没有在类体中定义
  • 可以直接通过 的方式定义一个新的类属性

类名.new_property_name

实例属性

  • 属于具体对象的属性,用于描述具体的对象
  • 只能通过实例对象访问,无法通过类名访问

实例属性的栗子

class PoloBlog:
    def __init__(self):
        # 在方法内部,通过 self.name 的方式定义的变量就是实例变量
        self.name = "小菠萝测试笔记"
        self.add = "https://www.cnblogs.com/poloyy/"

    # 下面定义了一个 say 实例方法
    def say(self):
        self.age = 13

# 实例化对象
blog = PoloBlog()
blog.say()

print(blog.name, blog.add, blog.age)


# 输出结果
小菠萝测试笔记 https://www.cnblogs.com/poloyy/ 13

  • 重点:__init__ 会在实例化对象的时候自动调用,因此 blog 创建成功就有 name、add 两个实例属性
  • 调用 say() 方法之后才有第三个实例属性 age

修改实例属性的栗子

blog.name = "小菠萝"
blog.add = "xiaopolo.com"
blog.age = 24

print(blog.name, blog.add, blog.age)


# 输出结果
小菠萝 xiaopolo.com 24

动态添加实例属性

blog.phone = 13501489999
print(blog.phone)


# 输出结果
13501489999

上面也有说到,通过 实例对象.属性名 的方式并不会给类变量赋值,而是定义一个新的实例变量

综合栗子

# 综合栗子
class PoloBlogObjectTest:
    # 类变量
    sum = 0

    # 初始化方法
    def __init__(self, name, age):
        # 实例变量
        self.name = name
        self.age = age
        # 类变量
        PoloBlogObjectTest.sum += 1

    # 实例方法
    def printNameAge(self):
        print(self.name, self.age)


poloTest1 = PoloBlogObjectTest("小菠萝一号", 24)
poloTest2 = PoloBlogObjectTest("小菠萝二号", 14)

print(PoloBlogObjectTest.sum)
# 调用实例方法
poloTest1.printNameAge()
poloTest2.printNameAge()


# 输出结果
2
小菠萝一号 24
小菠萝二号 14

不推荐实例属性和类属性同名

  • 类中,实例属性和类属性可以同名
  • 但这种情况下使用实例对象将无法调用类变量,它会首选实例变量,无论这个变量是否已定义
  • 实例独享绑定新的实例属性时,会直接覆盖掉重名的类属性

实例属性、类属性同名栗子

class Person:
    # 只有一个类变量
    name = "cool guy"

# 实例化一个对象
p = Person()
# 打印实例属性 name,因为实例对象并没有name属性,所以会继续查找class的name属性
print(p.name)
# 打印类属性 name
print(Person.name)

# 给实例绑定 name、age 属性
p.name = "bad guy"
p.age = 12

# 打印 name、age 属性
print(p.age)
# 由于实例属性优先级比类属性高,因此,它会屏蔽掉类的 name 属性
print(p.name)
# 仍然打印类的 name 属性
print(Person.name)


# 输出结果
cool guy
cool guy
12
bad guy
cool guy

实例对象属性引用的查找过程

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你! 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/384213.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【MySQL】操作库 —— 库的操作 -- 详解

一、增删数据库 1、创建数据库 create database db_name; 本质就是在 /var/lib/mysql 创建一个目录。 说明: 大写的表示关键字。[ ] 是可选项。CHARACTER SET:指定数据库采用的字符集。COLLATE:指定数据库字符集的校验规则。 2、数据库删除…

Python||数据分析之pyecharts 绘图(词云、气泡)

1. echarts 和 Pyecharts 简介 1.1echarts 简介: • echarts 是一个使用 JavaScript 实现的开源可视化库,涵盖各行业图表,满足各种需求。 • echarts 遵循 Apache-2.0 开源协议,免费商用。 • ECharts 最初由百度团队开源,并于 2018 年初捐赠给 Apache 基金会,成为 AS…

算法day12

算法day12 二叉树理论基础114 二叉树的前序遍历145 二叉树的后序遍历94 二叉树的中序遍历迭代法 二叉树理论基础 直接看代码随想录就完事了,之前考研也学过,大概都能理解 我这里就说说代码层面的。 二叉树的存储: 1、链式存储:这…

内容检索(2024.02.12)

随着创作数量的增加,博客文章所涉及的内容越来越庞杂,为了更为方便地阅读,后续更新发布的文章将陆续在此做简介并附上原文链接,感兴趣的小伙伴们可持续关注文章发布动态: 信号仿真类话题如何看待频域与时域的仿真差别-…

猫头虎分享已解决Bug || Python Error: ImportError: No module named ‘module_name‘

博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》 — 面试准备的宝典!《IDEA开发秘籍》 — 提升你的IDEA技能!《100天精通鸿蒙》 …

数学建模:EWM – TOPSIS 超强讲义! 原理、应用、代码

目录 一、综合评价指标预处理 1.定量指标的一致化处理(正向化处理) 2.定量指标的无量纲化处理 二、熵权法(EWM) 三、TOPSIS法 四、熵权法-TOPSIS的使用流程 案例:熵权法-TOPSIS的案例分析:水质评价 …

贪吃蛇的实现,基于windows操作系统

前言: 贪吃蛇从学习到真正实现花了9天实现,第一二天第一次学习,第三四五天第二次学习,第六七八天一边实现一边思考,才完成了贪吃蛇的代码。实现了贪吃蛇以后已经接近过年,我想自己再根据掌握的知识制作烟花…

leetcode 461. 汉明距离

比较简单的一题,先对两个整数进行异或操作,会将两个整数二进制形式中各个数字进行异或操作,不同的数字则为1,再通过移位操作统计得到的二进制数中为1的个数,即为所求。 Java代码如下: class Solution {pub…

STM32 STD/HAL库驱动W25Q64模块读写字库数据+OLED0.96显示例程

STM32 STD/HAL库驱动W25Q64 模块读写字库数据OLED0.96显示例程 🎬原创作者对W25Q64保存汉字字库演示: W25Q64保存汉字字库 🎞测试字体显示效果: 📑功能实现说明 利用W25Q64保存汉字字库,OLED显示汉字的时…

SVD奇异值分解

一、奇异值 奇异值(Singular Values)是线性代数中矩阵的重要性质之一,与奇异值分解(SVD)密切相关。让我们来更详细地了解一下奇异值的概念: 定义: 对于一个矩阵 ( A ),它的奇异值是…

【Chrono Engine学习总结】4-vehicle-4.1-vehicle的基本概念

由于Chrono的官方教程在一些细节方面解释的并不清楚,自己做了一些尝试,做学习总结。 1、基本介绍 Vehicle Overview Vehicle Mannel Vehicle的官方demo 1.1 Vehicle的构型 一个车辆由许多子系统构成:悬挂、转向、轮子/履带、刹车/油门、动…

双场板功率GaN HEMT电容模型以精确模拟开关行为

标题:Capacitance Modeling in Dual Field-Plate Power GaN HEMT for Accurate Switching Behavior(TED.16年) 摘要 本文提出了一种基于表面电位的紧凑模型,用于模拟具有栅极和源极场板(FP)结构的AlGaN/G…

JMM(Java内存模型)

Java内存模型(Java Memory Model,简称JMM)是Java语言规范中定义的一个抽象概念,它描述了程序中各个变量(包括实例字段、静态字段和构成数组对象的元素)在并发环境下的访问规则和一致性保证。JMM的主要目标是…

python+flask+django医院预约挂号病历分时段管理系统snsj0

技术栈 后端:python 前端:vue.jselementui 框架:django/flask Python版本:python3.7 数据库:mysql5.7 数据库工具:Navicat 开发软件:PyCharm . 第一,研究分析python技术&#xff0c…

点云标注工具

目录 3d手势识别 c 3d关键点,Bounding Box Labels Rectangle Labels KITTI 3D Ground Truth Annotator c标注工具 3d手势识别 GitHub - 99xtaewoo/Automated-Hand-3D-pose-annotation-Tool: Automated Hand 3D pose annotation Tool c 3d关键点,Bou…

【Django】Django文件上传

文件上传 1 定义&场景 定义&#xff1a;用户可以通过浏览器将图片等文件上传至网站。 场景&#xff1a; 用户上传头像。 上传流程性的文档[pdf&#xff0c;txt等] 2 上传规范-前端[html] 文件上传必须为POST提交方式 表单 <form> 中文件上传时必须带有 enctype…

电视上如何下载软件

电视上如何下载软件&#xff0c;告诉大家一个简单的方法&#xff0c;可以用DT浏览器下载软件&#xff0c;然后会自动安装这个软件&#xff0c;如有技术问题&#xff0c;可以免费解答

【初中生讲机器学习】8. KNN 算法原理 实践一篇讲清!

创建时间&#xff1a;2024-02-11 最后编辑时间&#xff1a;2024-02-12 作者&#xff1a;Geeker_LStar 你好呀~这里是 Geeker_LStar 的人工智能学习专栏&#xff0c;很高兴遇见你~ 我是 Geeker_LStar&#xff0c;一名初三学生&#xff0c;热爱计算机和数学&#xff0c;我们一起加…

从零开始学howtoheap:fastbins的house_of_spirit攻击3

how2heap是由shellphish团队制作的堆利用教程&#xff0c;介绍了多种堆利用技术&#xff0c;后续系列实验我们就通过这个教程来学习。环境可参见从零开始配置pwn环境&#xff1a;从零开始配置pwn环境&#xff1a;从零开始配置pwn环境&#xff1a;优化pwn虚拟机配置支持libc等指…

Python:解析获取连续的重叠对pairwise

简介&#xff1a;pairwise函数&#xff0c;返回从输入迭代器获取的重叠对的迭代器&#xff0c;是Python 3.10 新特性&#xff0c;表示一个迭代器从对象中获取连续的重叠对&#xff0c;在某些场景中可以优化代码运行效率。pairwise 函数是一种用于处理列表中元素之间配对操作的通…