Python 对象属性和类属性

 本篇为Python 面向对象之对象和类属性及动态添加属性和方法的概念、示例的学习笔记。

目录

对象属性与类属性

类属性

对象属性

属性优先级

动态对象属性只针对当前对象

动态添加属性和方法

动态添加属性

动态添加方法

引入方法参数处理库

添加方法

限制动态添加属性

总结


 

对象属性与类属性

类属性

创建Person类,设置一个name属性;

这时不进行实例化就可以直接通过类名获取属性,

这就是类属性。

示例如下:

class Person(object):# 这里的属性为类属性 通过类名来调用name = 'Person'print(Person.name)# 执行结果
# Person

 

对象属性

在类实例化为对象时,赋值或添加的属性为对象属性(不会改变原有类属性值)。

示例如下:

class Person(object):# 这里的属性为类属性 通过类名来调用name = 'Person'def __init__(self, name):# 对象属性赋值self.name = nameprint(Person.name)
p1 = Person('small cat')
# 打印对象属性
print(p1.name)
# 类属性没有发生改变
print(Person.name)

执行结果:

Personsmall catPerson

通过执行结果可以看出,实例化后赋值的name属性与类属性name并不相同,

最终也并没有通过赋值改变原有类属性的值。

属性优先级

对象属性优先级高于类属性。

场景:当Person对象未设置name属性时调用原有类属性值;

如果设置了对象属性,则调用对象属性值。

示例如下:

class Person(object):# 这里的属性为类属性 通过类名来调用name = 'Person'def __init__(self, name):# 对象属性赋值# self.name = namepassprint(Person.name)
p1 = Person('small cat')
# 打印对象属性
print(p1.name)
p1.name = '张三'
print(p1.name)

执行结果:

PersonPerson张三

删除对象中的name属性,在调用会用到同名的类属性。

示例如下:

class Person(object):# 这里的属性为类属性 通过类名来调用name = 'Person'def __init__(self, name):# 对象属性赋值self.name = nameprint(Person.name)
p1 = Person('small cat')
# 打印对象属性
print(p1.name)del p1.name
print(p1.name)

执行结果:

Personsmall catPerson

动态对象属性只针对当前对象

动态给对象添加对象属性,只针对当前对象生效,对于类创建的其他对象没有作用。

示例如下:

class Person(object):# 这里的属性为类属性 通过类名来调用name = 'Person'def __init__(self, name):# 对象属性赋值self.name = nameprint(Person.name)
p1 = Person('small cat')
p1.age = 18
print(p1.age)p2 = Person('zhang san')
print(p2.age)

执行结果:

Traceback (most recent call last):File "E:\lianxipy\python基础\对象属性和类属性\Person.py", line 15, in <module>print(p2.age)AttributeError: 'Person' object has no attribute 'age'Person183

注意:以后千万别说对象属性与类属性重名,因为对象属性会屏蔽掉类属性。但是当删除对象属性后,在使用又能使用类属性了。

动态添加属性和方法

实例化对象后可进行动态添加属性和方法。

动态添加属性

创建一个空类,动态添加属性。

示例如下:

class Person(object):passp1 = Person()
p1.name = '张三'
print(p1.name)

执行结果:

张三

动态添加属性,体现了动态语言的特点(灵活)

动态添加方法

引入方法参数处理库
from types import MethodType

添加方法

在动态添加方法时,需要对方法的参数进行处理,否则会抛出self异常。

示例如下:

class Person(object):passp1 = Person()
p1.name = '张三'
print(p1.name)def say(self):print('我的名字叫:%s' % self.name)p1.speak = MethodType(say, p1)
p1.speak()

执行结果:

张三我的名字叫:张三

 

限制动态添加属性

比如只允许给对象添加name,age,height,weight属性

解决:定义类的时候,定义一个特殊属性(__slots__),可以限制动态添加的属性。

__slots__的目的是限制当前类所能拥有的属性,如果不需要添加任意动态的属性,使用__slots__也能节省内存。

示例如下:

class Person(object):__slots__ = ('name', 'age', 'height', 'weight')p1 = Person()
p1.name = '张三'
print(p1.name)
p1.age = 18
print(p1.age)
p1.gender = '男'
print(p1.gender)

执行结果:

张三18Traceback (most recent call last):File "E:\lianxipy\python基础\动态添加属性\Person.py", line 12, in <module>p1.gender = '男'AttributeError: 'Person' object has no attribute 'gender'

当动态创建的gender属性不在__slots__中设置时,抛出异常。

总结

本篇为Python 面向对象之对象和类属性及动态添加属性和方法的概念、示例的学习笔记。

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

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

相关文章

目标检测数据集 - 人脸检测数据集下载「包含VOC、COCO、YOLO三种格式」

数据集介绍&#xff1a;行人检测数据集&#xff0c;真实场景高质量图片数据&#xff0c;涉及场景丰富&#xff0c;比如校园行人、街景行人、道路行人、遮挡行人、严重遮挡行人数据&#xff1b;适用实际项目应用&#xff1a;公共场所监控场景下行人检测项目&#xff0c;以及作为…

如何写好年终总结?

前面有读者留言问年终总结要怎么写&#xff0c;我一听你要聊这个我可不困了&#xff0c;这活我熟啊&#xff0c;谁不知道我厂是 PPT 之王。先来一套打法闭环方法论&#xff0c;再来一套赋能抓手组合拳&#xff0c;如此这般&#xff0c;便可笑傲于江湖。 玩笑归玩笑&#xff0c…

常用界面设计组件 —— 字符串与输入输出组件(QT)

2.2 字符串与输入输出组件2.2.1 字符串与数值之间的转换2.2.2 QString的常用功能 2.2 字符串与输入输出组件 2.2.1 字符串与数值之间的转换 界面设计时使用最多的组件恐怕就是QLabel和 QLineEdit了&#xff0c;QLabel用于显示字符串&#xff0c;QLineEdit用于 显示和输入字符…

MetaGPT-打卡day01

MetaGPT是一个基于大型语言模型&#xff08;LLMs&#xff09;的多智能体协作框架。它利用SOP&#xff08;Standard Operating Procedures&#xff0c;标准作业程序&#xff09;来协调基于大语言模型的多智能体系统&#xff0c;从而实现元编程技术。该框架使用智能体模拟了一个虚…

程序员必备的面试技巧:从忍者到铁金刚的华丽转变

在科技世界的江湖中&#xff0c;程序员作为武林高手&#xff0c;面试是他们闯荡江湖的一场重要考验。在这场考验中&#xff0c;我们需要像忍者一样灵活&#xff0c;像侦探一样聪明&#xff0c;还要像无敌铁金刚一样坚定。本文将带你探索程序员必备的面试技巧&#xff0c;助你书…

ioDraw在线图表工具 - 轻松制作专业图表,只需3步!

还在花大量时间手动画图表&#xff1f;还在为图表样式而烦恼&#xff1f;ioDraw为你提供一站式解决方案&#xff01;ioDraw在线图表工具实现了AI自动生成图表&#xff0c;让你轻松制作专业图表&#xff0c;只需3步&#xff01; 1. 录入数据 只需将你的数据告诉ioDraw AI助手&…

最新版Navicat的安装与激活

最新版Navicat的安装与激活 图文教程链接&#xff1a;图文教程视频教程链接&#xff1a;视频教程此教程适用于Navicat161之后版本的激活&#xff0c;Navicat161之后的版本暂时无法通过注册机的方式进行激活&#xff0c;如需通过注册机激活Navicat161及之前的版本&#xff0c;请…

[Docker] Dockerfile

文章目录 什么是 Dockerfile&#xff1f;使用 Dockerfile 定制镜像开始构建镜像上下文路径 指令详解COPYADDCMDENTRYPOINTENVARGVOLUMEEXPOSEWORKDIRUSERHEALTHCHECKONBUILD 什么是 Dockerfile&#xff1f; Dockerfile 是一个用来构建镜像的文本文件&#xff0c;文本内容包含了…

Pandas实战100例 | 案例 52: 重命名列

案例 52: 重命名列 知识点讲解 在数据处理过程中&#xff0c;有时需要更改 DataFrame 中的列名。Pandas 提供了 rename 方法来轻松实现列的重命名。 重命名列: 使用 rename 方法并通过 columns 参数传递一个字典&#xff0c;可以将旧列名映射到新列名。 示例代码 # 准备数…

Spring Boot异常处理!!!

SpringBoot默认的处理异常的机制&#xff1a;SpringBoot 默认的已经提供了一套处理异常的机制。一旦程序中出现了异常 SpringBoot 会向/error 的 url 发送请求。在 springBoot 中提供了一个叫 BasicErrorController 来处理/error 请求&#xff0c;然后跳转到默认显示异常的页面…

【mysql 插入数据问题】MySQL插入数据阻塞问题及优化方案

摘要&#xff1a;本文主要介绍了MySQL数据库在插入数据时出现阻塞的常见原因&#xff0c;以及如何查看和优化这些问题。通过分析慢查询日志、优化索引、优化数据类型、批量插入等手段&#xff0c;可以有效地提高MySQL数据库的插入性能。 一、引言 MySQL作为一款广泛应用于各类项…

用Pytorch实现线性回归模型

目录 回顾Pytorch实现步骤1. 准备数据2. 设计模型class LinearModel代码 3. 构造损失函数和优化器4. 训练过程5. 输出和测试完整代码 练习 回顾 前面已经学习过线性模型相关的内容&#xff0c;实现线性模型的过程并没有使用到Pytorch。 这节课主要是利用Pytorch实现线性模型。…

Pandas实战100例 | 案例 51: 日期时间过滤

案例 51: 日期时间过滤 知识点讲解 当你的 DataFrame 包含 datetime 类型的列时&#xff0c;你可以基于日期时间条件过滤数据。这在处理时间序列数据时特别有用。 日期时间过滤: 使用布尔索引&#xff0c;可以根据日期时间条件过滤数据。 示例代码 # 准备数据和示例代码的…

SVD和EVD的关系

文章目录 SVD和EVD基本概念具体计算中的关系 SVD和EVD基本概念 奇异值分解&#xff08;Singular Value Decomposition&#xff0c;SVD&#xff09;和特征值分解&#xff08;Eigenvalue Decomposition&#xff0c;EVD&#xff09;是矩阵分解的两种常见方法&#xff0c;它们在线…

(1)(1.13) SiK无线电高级配置(六)

文章目录 前言 15 使用FTDI转USB调试线配置SiK无线电设备 16 强制启动加载程序模式 17 名词解释 前言 本文提供 SiK 遥测无线电(SiK Telemetry Radio)的高级配置信息。它面向"高级用户"和希望更好地了解无线电如何运行的用户。 15 使用FTDI转USB调试线配置SiK无线…

Oracle12c创建表空间及用户

Oracle12c创建表空间及用户 1. 表空间相关内容 表空间数据文件容量与DB_BLOCK_SIZE有关&#xff0c;在初始建库时&#xff0c;DB_BLOCK_SIZE要根据实际需要&#xff0c;设置为 4K、8K、16K、32K、64K等几种大小&#xff0c;ORACLE的物理文件最大只允许4194304个数据块&#xf…

Go 语言运算符详解:加法、算术、赋值、比较、逻辑和位运算符全面解析

运算符用于对变量和值执行操作。 加号运算符&#xff08;&#xff09;将两个值相加&#xff0c;如下面的示例所示&#xff1a; 示例代码&#xff1a; package mainimport ("fmt" )func main() {var a 15 25fmt.Println(a) }尽管加号运算符通常用于将两个值相加&a…

vue3 锚点定位 点击滚动高亮

功能描述 点击导航跳到对应模块的起始位置&#xff0c;并且高亮点击的导航&#xff1b; 滚动到相应的模块时&#xff0c;对应的导航也自动高亮&#xff1b; 效果展示 注意事项 一定要明确哪个是要滚动的盒子&#xff1b;滚动的高度要减去导航栏的高度&#xff1b;当前在导航1…

C++ 树与图的深度优先遍历 || 模版题:树的重心

树和无向图都可以看成有向图&#xff08;无向图在添加边的时候添加双向的&#xff09; 下面是模版&#xff0c;实际使用要根据情况改&#xff1a; #include <iostream> #include <cstring> using namespace std;const int N 10010, M N * 2;int n; int h[N], e[…

【VTKExamples::PolyData】第二期 曲率

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 前言 本文分享VTK中的曲率计算及显示,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(^U^)ノ~YO 目录 前言 1. Curvatures样例 2. vtkCurv…