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

news/2024/3/4 18:42:30/文章来源:https://blog.csdn.net/2301_78843735/article/details/136088673

什么是对象和类

什么是 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 = 24print(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 = nameself.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

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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系编程新知网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

推荐系统|行为序列_用户行为序列建模、Din模型和SIM模型

文章目录 用户行为序列建模Din模型Din模型的缺点 用户行为序列建模 物品ID通过Embedding将会得到一个向量,性质差不多的向量在空间中也会处于差不多的位置,可以用取平均方式得到一个综合所有向量的向量。 取平均后可以作为代表用户的一个特征。 以上的…

VTK 三维场景的基本要素(相机) vtkCamera 相机的运动

相机的运动 当物体在处于静止位置时,相机可以在物体周围移动,摄取不同角度的图像 移动 移动分为相机的移动,和相机焦点的移动;移动改变了相机相对焦点的位置,离焦点更近或者更远;这样就会改变被渲染的物体…

Molecular Cell | MD鉴定琥珀酸与SUCNR1的结合路径以及在SUCNR1上的两个高亲和力结合位点

Background SUCNR1(GPR91)是一种G蛋白偶联受体,能够感知代谢应激信号,如琥珀酸。这种受体在细胞修复、重塑以及炎症反应中发挥作用。尽管已经确定了SUCNR1的正位结合位点,但其分子激活机制尚不清楚。本研究旨在通过分子…

tab 切换类交互功能实现

tab切换类交互&#xff1a; 记录激活项&#xff08;整个对象/id/index)动态类型控制 下面以一个地址 tab 切换业务功能为例&#xff1a; <div class"text item" :class"{active : activeAddress.id item.id}" click"switchAddress(item)"…

C++ STL string类使用及实现详解

1. string简介 C语言中&#xff0c;可以用字符数组来存储字符串&#xff0c;如&#xff1a; char ch[] "hello world"; C中&#xff0c;可以使用string类对象来存储字符串&#xff0c;使用起来比C语言中的字符数组要方便得多&#xff0c;而且不用考虑容量的问题。…

Redis核心技术与实战【学习笔记】 - 24.Redis 脑裂

简述 所谓脑裂&#xff0c;就是指在主从集群中&#xff0c;同时有两个主节点&#xff0c;它们都能接收写请求。而脑裂最直接的影响就是客户端不知道该往哪个主节点写入数据&#xff0c;结果就是不同的客户端会往不同的主机诶点上写入数据。而且&#xff0c;严重的话&#xff0…

Android Studio 中使用 Gradle 配置多渠道打包 配置不同的渠道名称 配置不同的App名称 配置不同的Logo

废话 三种操作都是可以混合一起用的&#xff0c;本来也不是很难的事情&#xff0c;为了方便分别理解&#xff0c;这里我就分开处理了。 如果需要将打包出来的apk的名称自动命名成指定格式&#xff0c;也可以进行配置&#xff0c;我这里没这个需求&#xff0c;所以这里就不讨论了…

应用程序数字证书生成及签名步骤

1.非管理员权限切换到管理员用户下&#xff0c;再C盘找到C:\Program Files (x86)\Windows Kits&#xff0c;查看当前路径下是否包含生成数字签名的文件。 注意&#xff1a; 此时不同的电脑会有不同的路径&#xff08;如蓝色框&#xff09;&#xff0c;需要找到具备生成工具的相…

Spring是怎么解决循环依赖的

首先先解释一下什么叫循环依赖 循环依赖:循环依赖其实就是循环引用,也就是两个或两个以上的bean互相持有对方,最终形成闭环.比如A依赖于B,B依赖于A 循环依赖在spring中是允许存在的,spring框架依据三级缓存已经解决了大部分的循环依赖 一级缓存:单例池,缓存已经经历了完整的…

【漏洞复现】狮子鱼CMS文件上传漏洞(image_upload.php)

Nx01 产品简介 狮子鱼CMS&#xff08;Content Management System&#xff09;是一种网站管理系统&#xff0c;它旨在帮助用户更轻松地创建和管理网站。该系统拥有用户友好的界面和丰富的功能&#xff0c;包括页面管理、博客、新闻、产品展示等。通过简单直观的管理界面&#xf…

re:从0开始的CSS学习之路 1. CSS语法规则

0. 写在前面 现在大模型卷的飞起&#xff0c;感觉做页面的活可能以后就不需要人来做了&#xff0c;不知道现在还有没有学前端的必要。。。 1. HTML和CSS结合的三种方式 在HTML中&#xff0c;我们强调HTML并不关心显示样式&#xff0c;样式是CSS的工作&#xff0c;现在就轮到C…

disql备份还原

disql备份还原 前言 本文档根据官方文档&#xff0c;进行整理。 一、概述 在 disql 工具中使用 BACKUP 语句你可以备份整个数据库。通常情况下&#xff0c;在数据库实例配置归档后输入以下语句即可备份数据库&#xff1a; BACKUP DATABASE BACKUPSET db_bak_01;语句执行完…

Spring基础 - Spring简单例子引入Spring要点

Spring基础 - Spring简单例子引入Spring要点 设计一个Spring的Hello World 设计一个查询用户的案例的两个需求&#xff0c;来看Spring框架帮我们简化了什么开发工作 pom依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"htt…

x-cmd pkg | httpx - 为 Python 设计的下一代 HTTP 客户端库

目录 简介首次用户功能特点进一步探索 简介 HTTPX 是一个为 Python 设计的下一代 HTTP 客户端库&#xff0c;由 Tom Christie 创建。它提供了同步和异步的 API&#xff0c;并支持 HTTP/1.1 和 HTTP/2 协议。与 Requests 库类似&#xff0c;但增加了对异步请求的支持和 HTTP/2 …

《UE5_C++多人TPS完整教程》学习笔记9 ——《P10 创建会话(Creating A Session)》

本文为B站系列教学视频 《UE5_C多人TPS完整教程》 —— 《P10 创建会话&#xff08;Creating A Session&#xff09;》 的学习笔记&#xff0c;该系列教学视频为 Udemy 课程 《Unreal Engine 5 C Multiplayer Shooter》 的中文字幕翻译版&#xff0c;UP主&#xff08;也是译者&…

拟合案例1:matlab积分函数拟合详细步骤及源码

本文介绍一下基于matlab实现积分函数拟合的过程。采用的工具是lsqcurvefit和nlinfit两个函数工具。关于包含积分运算的函数,这里可以分为两大类啊。我们用具体的案例来展示:一种是积分运算中不包含这个自变量,如下图的第一个公式,也就是说它这个积分运算只有R和Q这两个待定…

基于图像掩膜和深度学习的花生豆分拣(附源码)

目录 项目介绍 图像分类网络构建 处理花生豆图片完成预测 项目介绍 这是一个使用图像掩膜技术和深度学习技术实现的一个花生豆分拣系统 我们有大量的花生豆图片&#xff0c;并以及打好了标签&#xff0c;可以看一下目录结构和几张具体的图片 同时我们也有几张大的图片&…

《CSS 简易速速上手小册》第6章:高级 CSS 技巧(2024 最新版)

文章目录 6.1 使用 CSS 变量进行设计&#xff1a;魔法配方的调配6.1.1 基础知识6.1.2 重点案例&#xff1a;创建可定制的主题6.1.3 拓展案例 1&#xff1a;响应式字体大小6.1.4 拓展案例 2&#xff1a;使用 CSS 变量创建动态阴影效果 6.2 calc(), min(), max() 等函数的应用&am…

【机器学习与自然语言处理】预训练 Pre-Training 各种经典方法的概念汇总

【机器学习与自然语言处理】预训练 Pre-Training 各种经典方法的概念汇总 前言请看此正文预训练 Pre-Training无监督学习 unsupervised learning概念&#xff1a;标签PCA 主成分分析&#xff08;Principal Component Analysis&#xff09;降维算法LSA 潜在语义分析&#xff08;…

Github 2024-02-07 开源项目日报 Top9

根据Github Trendings的统计&#xff0c;今日(2024-02-07统计)共有9个项目上榜。根据开发语言中项目的数量&#xff0c;汇总情况如下&#xff1a; 开发语言项目数量Rust项目2TypeScript项目2Python项目2Ruby项目1HTML项目1NASL项目1Go项目1C项目1Svelte项目1C项目1 React Nat…