类属性和对象属性
6.3 类属性和对象属性
在类定义中,属性按照归属分为对象属性、类属性。按照调用的私密性分为一般属性和私有属性。
6.3.1 类属性和对象属性
对象属性是最常用到的一种属性。即使我们对上面的类:MyClass1实例化了一个mc的对象,mc对象也不能进行有实质的操作。因为mc对象的类:MyClass1中既没有定义属性也没有定义方法。
在定义类时还能定义类属性。接下来我们创建一个类:MyClass2,并添加一个类属性:class_attr和对象属性:obj_attr。然后再通过该类实例化一个对象mc。再通过不同的方式访问类属性和对象属性,以便掌握类属性和对象属性的区别。代码如下:
class MyClass2:class_attr = 'ca'def __init__(self):self.obj_attr = 'oa'mc = MyClass2()
print('通过对象访问类属性', mc.class_attr)
print('通过对象访问对象属性', mc.obj_attr)
print('通过类访问类属性', MyClass2.class_attr)
print('通过类访问对象属性', MyClass2.obj_attr)
通过对象访问类属性 ca
通过对象访问对象属性 oa
通过类访问类属性 ca
Traceback (most recent call last):
File “E:\BaiduNetdiskWorkspace\FrbPythonFiles\study\面向对象\类的私有属性.py”, line 12, in
print(‘通过类访问对象属性’, MyClass2.obj_attr)
AttributeError: type object ‘MyClass2’ has no attribute ‘obj_attr’
代码解释:
def __init__(self):
:表示创建一个类的构造函数,所谓构造函数,就是在类的实例化时会自动执行的方法。在Python类定义时,有一些是比较特殊的方法,这种方法的方法名一般以双__
开始和结尾,在Python类中有着特别的意义。基于此,我们一般在类中定义方法时,方法名最好不要以__
开始。类一旦进行实例化后,就会执行__init__
这个构造方法进行初始化,一般这里会进行属性的初始化绑定和一些其他初始化动作。
mc = MyClass2()
:对MyClass2类的实例化,实例化后的对象就是mc
。接下来就可以通过mc来进行操作了。
self.obj_attr = ‘oa’:进行对象属性的值绑定。这里的self代表的就是实例化后的对象自己。
class_attr = ‘ca’:类属性的赋值,类属性赋值在类定义后就会生效,不需要实例化成对象。
通过对象名.属性、类名.属性就可以获取到相应的属性了。
通过上面的代码可以看到,通过对象是可以正常访问到对象属性的,通过类可以访问到类属性,但是不能访问到对象属性。
对象或类对于属性的访问如下:
对象或类 | 对象属性 | 类属性 |
---|---|---|
对象 | √ | √ |
类 | × | √ |
接着我们来看是否能够对属性进行修改:
class Person:age = 18def __init__(self):self.name = '张三'self.gender = '男'zhangsan = Person()
print('通过对象修改对象一般属性', '+' * 30)
print(zhangsan.gender)
zhangsan.gender = '女'
print(zhangsan.gender)print('通过对象修改类一般属性', '+' * 30)
print(zhangsan.age)
zhangsan.age = 30
print(zhangsan.age)
print(Person.age)print('通过类修改类一般属性', '+' * 30)
print(Person.age)
Person.age = 25
print(Person.age)
print(zhangsan.age)
通过对象修改对象一般属性 ++++++++++++++++++++++++++++++
男
女
通过对象修改类一般属性 ++++++++++++++++++++++++++++++
18
30
18
通过类修改类一般属性 ++++++++++++++++++++++++++++++
18
25
30
通过上面的代码可以看到,无论是对象还是类,对于能够访问到的属性就可以进行修改。
但是对象修改类属性后,通过类调用的属性不变。而如果是通过类修改类属性后,对象调用的类属性也不变。也就是说,对于类属性,对象修改后不会影响到类,类修改后也不会影响到对象。
对象或类对于属性的修改如下:
对象或类 | 对象属性 | 类属性 |
---|---|---|
对象 | √ | √ |
类 | × | √ |
6.3.2 一般属性和私有属性
平常定义类时,直接定义的都是一般属性,就是可以通过对象名.属性、类名.属性直接调用到的。如上面例子中的:mc.class_attr和MyClass2.class_attr。
如果有些属性名开发者不想让其它开发人员调用时,则可以创建以双__
开头的属性名,这种属性名称为私有属性,在对象、类进行属性调用时,则不能通过简单的x.属性名
的方式调用对象的属性。
class Person:__age = 18def __init__(self):self.name = '张三'self.__gender = '男'zhangsan = Person()
print(zhangsan.__gender)
在上面的定义中,通过self.__gender定义了一个私有属性,直接运行上面的命令后会报错,报错如下:
Traceback (most recent call last):
File “E:\BaiduNetdiskWorkspace\FrbPythonFiles\study\面向对象\创建类.py”, line 17, in
print(zhangsan.__gender)
AttributeError: ‘Person’ object has no attribute ‘__gender’
当然,在Python中没有真正的私有属性,通过__
开头命名的属性,在Python类中只是被自动修改了名称而已。我们可以通过print(dir(zhangsan))
查看到zhangsan这个对象中所有的属性和方法:
[‘_Person__age’, ‘_Person__gender’, ‘class’, ‘delattr’, ‘dict’, ‘dir’, ‘doc’, ‘eq’, ‘format’, ‘ge’, ‘getattribute’, ‘gt’, ‘hash’, ‘init’, ‘init_subclass’, ‘le’, ‘lt’, ‘module’, ‘ne’, ‘new’, ‘reduce’, ‘reduce_ex’, ‘repr’, ‘setattr’, ‘sizeof’, ‘str’, ‘subclasshook’, ‘weakref’]
我们看到,输出的结果中有2个属性:_Person__age
, _Person__gender
,这个属性其实就是之前定义的__age
和__gender
,因为是私有属性,于是Python直接修改了这个属性的名字,改成了:_类名+私有属性。于是,其实我们可以通过该属性名进行调用:
>>> print(zhangsan._Person__gender)
>>> print(zhangsan._Person__age)
>>> print(Person._Person__age)
男
18
18
私有属性的修改
class Person:__age = 18def __init__(self):self.name = '张三'self.__gender = '男'zhangsan = Person()
print('通过对象修改对象私有属性', '+' * 30)
print(zhangsan._Person__gender)
zhangsan._Person__gender = '女'
print(zhangsan._Person__gender)print('通过对象修改类私有属性', '+' * 30)
print(zhangsan._Person__age)
zhangsan._Person__age = 30
print(zhangsan._Person__age)
print(Person._Person__age)print('通过类修改类私有属性', '+' * 30)
print(Person._Person__age)
Person._Person__age = 25
print(Person._Person__age)
print(zhangsan._Person__age)
通过对象修改对象私有属性 ++++++++++++++++++++++++++++++
男
女
通过对象修改类私有属性 ++++++++++++++++++++++++++++++
18
30
18
通过类修改类私有属性 ++++++++++++++++++++++++++++++
18
25
30
我们可以看到,如同一般的属性一样,对于类属性,对象修改后不会影响到类,类修改后也不会影响到对象。
注意:按照约定俗成的规定,以一个下划线开头的实例变量名(例如_age)在外部是可以直接访问的(弱私有),但是这个形式的变量表达的意思是,“虽然我可以被访问,但是请把我视为私有变量,不要随意访问”。一般地在IDE中也会有所提示:保护成员的访问类。
6.3.3 类属性和对象属性的区别
现在我们来总结一下类属性和对象属性的区别。
在定义时,使用关键字self
来定义对象属性。而类属性不需要,只需要在类最内层直接为变量赋值即可。该变量就是类属性。
在访问时,可以通过对象.
的方式直接访问到一般对象属性和一般类属性,而类.
的方式只能访问到一般类属性。对于私有属性无法直接访问,但是可以通过x._类名+属性名的方式访问到。同样的,不能通过类.
的方式访问到对象的私有属性。
在修改时,可以访问就可以修改,只不过对于类属性,对象修改后不会影响到类,类修改后也不会影响到对象。而对象属性,只有对象能够访问和修改,类则无法访问。
相关文章:
类属性和对象属性
6.3 类属性和对象属性 在类定义中,属性按照归属分为对象属性、类属性。按照调用的私密性分为一般属性和私有属性。 6.3.1 类属性和对象属性 对象属性是最常用到的一种属性。即使我们对上面的类:MyClass1实例化了一个mc的对象,mc对象也不能…...

【TensorFlow 】查看Tensorflow和python对应版本、将现有的TensorFlow更新到指定的版本
1、查看Tensorflow和python对应版本 1.1这里我是在TensorFlow官方网址产看的 1、打开官方网址 https://pypi.org/project/tensorflow/1.1.0rc2/#files但是这个网址好像打不开,点击会出现这样 问题不大 输入Tensorflow然后点击搜索,就会跳转到https://p…...

VO、DTO、BO、PO、DO区别
VO、DTO、BO、PO、DO区别 VO:(View Object)视图对象,一般位于Controller层,用于展示视图。DTO:(Data Transfer Object)数据传输对象, 即RPC 接口请求或传输出去的对象&a…...

速看!!!一套能直接拿捏大厂面试官的软件测试面试宝典
3.5.1、说说你们是怎么做自动化测试的☆☆☆☆☆我们的自动化测试主要是web UI的自动化测试,主要用于冒烟测试和主要功能的回归测试或者主流浏览器的兼容性测试,作为手工测试的一种补充,提高测试效率,减少一些重复性的测试工作。1…...

超级完整 的 Maven 讲解 以及私服搭建
第一章 Maven 简介 1.1、Maven 概述 Maven 是一款基于 Java 平台的项目管理和整合工具,它将项目的开发和管理过程抽象成一个项目对象模型(POM)。开发人员只需要做一些简单的配置,Maven 就可以自动完成项目的编译、测试、打包、发…...

数据结构之算法的时间复杂度和空间复杂度
本章重点: 1.算法效率 2.时间复杂度 3.空间复杂度 4. 常见时间复杂度以及复杂度oj练习 目录 1.算法效率 1.2算法的复杂度 2.时间复杂度 2.1 时间复杂度的概念 2.2 大O的渐进表示法 2.3常见时间复杂度计算举例 3.空间复杂度 4. 常见复杂度对比 5.复杂度…...

【微信小程序】使用页面跳转并携带多个特定参数
前言在我们项目的搭建时常常会用到页面跳转,在微信小程序中也支持多个跳转类型。如(wx.switchTab\wx.reLauch\wx.redirectTo\wx.navigateTo\wx.navigateBack)等等,每一个路由API都是有相对应的特定跳转功能,在这里我就不赘述了。微信开发者文…...

CVPR 2021 | Involution:超越convolution和self-attention的神经网络算子
CVPR 2021 | Involution:超越convolution和self-attention的神经网络算子 论文地址:https://arxiv.org/pdf/2103.06255v2.pdf 代码地址:https://github.com/d-li14/involution Involution卷积,文章描述说它比convolution更轻量更高效,形式上比self-attention更加简洁,可以…...

11 OpenCV图像识别之人脸识别
文章目录1 Eigenfaces1.1 建模流程1.2 示例代码2 Fisherfaces2.1 建模流程2.2 示例代码3 Local Binary Histogram3.1 建模流程3.2 示例代码OpenCV 提供了三种人脸识别方法:Eigenfaces Eigenfaces是一种基于PCA(Principal Component Analysis,…...

ssh设置:免密登入、修改默认端口、禁止root登入、限制错误登入次数
服务器: 客户端: 在下面不再说明服务器和客户端。 1.修改ssh默认端口 是在服务器中设置。 该设置涉及三部分:sshd配置文件修改/增加新端口、Selinux添加新端口、Firewall开放新端口。 vim /etc/ssh/sshd.config,找到#Port行&…...

【Fastdfs】| 入门连续剧——安装
作者:狮子也疯狂 专栏:《spring开发》 坚持做好每一步,幸运之神自然会降临在你的身上 目录一. 🦁 前言Ⅰ. 🐇 为什么要使用分布式文件系统?1.1 单机系统 vs 独立文件服务器1.2 分布式文件系统1.3 FastDFS引…...

【ESP32-S3】Pycharm 使用 microPython 教程(避坑)
一、下载Pycharm等操作 1.百度云下载链接 链接:https://pan.baidu.com/s/1tkbMzS5B_v-Cn4WQlTqS3Q?pwd0108 提取码:0108 2.安装 按照压缩包中的教程来,你懂的。 二、配置microPython环境 1.安装 microPython 插件 1.1 File > Sett…...

Allegro如何通过报表的方式检查单板上是否有假器件操作指导
Allegro如何通过报表的方式检查单板上是否有假器件操作指导 在做PCB设计的时候,输出生产文件之前,必须保证PCB上不能存在假器件,如下图,是不被允许的 当PCB单板比较大,如何通过报表的方式检查是否存在假器件,具体操作如下 点击Tools点击Reports...

清理bib文件(删除重复项,仅保留tex中引用的条目)
在写latex文件的过程中,经常会遇到添加了一堆文献的bibtex到bib文件中,有时候文章一长同一篇文献用不同的cite-key引用了多次,同时也会有一些文献最后并没被正文引用,这就需要对bib文件进行清理。 删除重复项 可以用JabRef 在J…...
Rust编程细节知识点拾遗
1.Rust中每一个引用都有生命周期,也就是引用保持有效的作用域。生命周期主要目标是避免悬垂引用,悬垂引用就是引用了已经释放的值。函数中,x的生命周期不能小于返回值得生命周期。当有x和y的时候,两者的生命周期是两个里面较小的那…...

【Linux】线程池
🎇Linux: 博客主页:一起去看日落吗分享博主的在Linux中学习到的知识和遇到的问题博主的能力有限,出现错误希望大家不吝赐教分享给大家一句我很喜欢的话: 看似不起波澜的日复一日,一定会在某一天让你看见坚持…...

运动版蓝牙耳机什么牌子的好、运动款蓝牙耳机推荐
何以解忧?唯有运动。事实已经无数次证明,运动不但可以让你更瘦身、更紧实,更重要的是精神状态也能焕然一新。不知道各位是不是也跟我一样,喜欢在运动的时候听着音乐。但是听音乐就需要有好的续航,否则运动一半没电了&a…...

MySQL中自带的数据库表相关介绍
mysql的自带数据库表主要有以下几个: (1)information_schema (2)performance_schema (3)mysql (4)sys (5)可能存在空数据库test 一、informa…...

【微信小程序】--注册小程序账号(一)
💌 所属专栏:【微信小程序开发教程】 😀 作 者:我是夜阑的狗🐶 🚀 个人简介:一个正在努力学技术的CV工程师,专注基础和实战分享 ,欢迎咨询! &#…...
Java多线程 - 利用Callable或CompletableFuture实现多线程异步任务执行
文章目录1. Callable接口源码2. Future接口的源码3. RunnableFuture接口和FutureTask实现类4. 利用线程池和Callable接口实现异步执行任务5. 利用CompleteFutable实现多线程异步任务执行1. Callable接口源码 FunctionalInterface public interface Callable<V> {// 这个…...

基于LocalAI与cpolar技术协同的本地化AI模型部署与远程访问方案解析
文章目录 前言1. Docker部署2. 简单使用演示3. 安装cpolar内网穿透4. 配置公网地址5. 配置固定公网地址前言 各位极客朋友们!今天要向大家推荐一套创新性的本地部署方案——LocalAI技术架构。这款开源工具包能够将普通配置的笔记本电脑转化为具备强大算力的AI工作站,轻松实现…...
OD 算法题 B卷【BOSS的收入】
文章目录 BOSS的收入 BOSS的收入 一个公司只有一个boss,其有若干一级分销,一级分销又有若干二级分销,每个分销只有唯一的上级;每个月,下级分销需要将自己的总收入(自己的下级上交的)࿰…...

国标GB28181视频平台EasyGBS视频实时监控系统打造换热站全景可视化管理方案
一、方案背景 在城市供热体系中,换热站作为连接热源与用户的核心枢纽,其运行稳定性直接影响供热质量。面对供热规模扩大与需求升级,传统人工巡检模式暴露出效率低、响应慢、监测不足等问题。基于GB28181协议的EasyGBS视频实时监控系统&…...
益莱储参加 Keysight World 2025,助力科技加速创新
全球领先的测试和测量技术解决方案提供商益莱储 / Electro Rent 再次受邀参加2025 年 6 月 26 日将于在 上海浦东嘉里大酒店隆重举行的 Keysight World Tech Day 2025 年度盛会,与是德科技深度合作,助力行业科技创新,为客户提供更经济、更灵活…...

Authpf(OpenBSD)认证防火墙到ssh连接到SSH端口转发技术栈 与渗透网络安全的关联 (RED Team Technique )
目录 🔍 1. Authpf概述与Shell设置的作用 什么是Authpf? Shell设置为/usr/sbin/authpf的作用与含义 🛠️ 2. Authpf工作原理与防火墙绕过机制 技术栈 工作原理 防火墙绕过机制 Shell关联 🌐 3. Authpf与SSH认证及服务探测…...

32 C 语言字符处理函数详解:isalnum、isalpha、iscntrl、isprint、isgraph、ispunct、isspace
1 isalnum() 函数 1.1 函数原型 #include <ctype.h>int isalnum(int c); 1.2 功能说明 isalnum() 函数用于检查传入的整数参数是否为 ASCII 编码的字母或数字字符(A - Z、a - z、0 - 9,对应 ASCII 值 65 - 90、97 - 122、48 - 57)。…...

Excel表格批量下载 CyberWin Excel Doenlaoder 智能编程-——玄武芯辰
使用 CyberWin Excel Downloader 进行 Excel 表格及各种文档的批量下载,优势显著。它能大幅节省时间,一次性获取大量所需文档,无需逐个手动下载,提升工作效率。可确保数据完整性与准确性,避免因重复操作产生失误。还便…...

web3-区块链基础:从区块添加机制到哈希加密与默克尔树结构
区块链基础:从区块添加机制到哈希加密与默克尔树结构 什么是区块链 抽象的回答: 区块链提供了一种让多个参与方在没有一个唯一可信方的情况下达成合作 若有可信第三方 > 不需要区块链 [金融系统中常常没有可信的参与方] 像股票市场,或者一个国家的…...

R-CNN 模型算法流程梳理
目录 一、R-CNN整体流程 二、需要注意的地方 论文连接:[1311.2524] Rich feature hierarchies for accurate object detection and semantic segmentation 如果你之前了解过RNN,很容易混淆认为R-CNN也具有RNN的时序循环功能,这种理解是错误…...
细说C语言将格式化输出到FILE *stream流的函数fprintf、_fprintf_I、fwprintf、_fwprintf_I
目录 1、将格式化数据输出到FILE *stream流基本型 (1)语法 (2)参数 (3)示例 2、将格式化数据输出到FILE *stream流并启用并启用在格式字符串中使用参数的顺序的规范 (1)语法 …...