Python学习——面向对象_类属性和类方法

2023-05-16

根据B站 “黑马程序员” 的python教程记录笔记。 

在前面的学习中,我们已经知道:

使用面向对象开发,第一步是设计类

        使用 类名() 创建对象,而这个动作分为几步:

                1.在内存中为对象分配空间

                2.调用初始化方法 __init__ 为对象初始化

                3.对象创建后,内存 中就有了一个对象的 实实在在 的存在 --- 实例

因此,通常也会把:

        1.创建出来的 对象 叫做 的实例

        2.创建对象的 动作 叫做 实例化

        3.对象的属性 叫做 实例属性

        4.对象调用的方法 叫做 实例方法

在程序执行时:

1.对象各自拥有自己的 实例属性

2.调用对象方法,可以通过 self.

        访问自己的属性

        调用自己的方法

而这些都是类创建出来的对象(实例)的属性和方法,那我们反观类,提出一个问题:

        类是否也有属性和方法呢?

答案是,有。

接下来,我们就来了解一下类的属性和方法是什么,需要怎么定义以及怎么使用,在什么环境下使用。

一、类属性和类方法是什么


首先需要知道,类是一个特殊的对象。
在python中,一切皆对象:
        class AAA:定义的类属于 -> 类对象
        obj1 = AAA() 属于 -> 实例对象
在程序运行时,类同样会被加载到内存.
所以,在python中,是一个特殊的对象 --> 类对象
在程序运行时,类对象在内存中只有一份,使用一个类可以创建多个对象实例。
除了封装实例的属性和方法外,类对象还可以拥有自己的属性和方法:
        1.类属性         2.类方法

其中
1.类属性:
通常用来记录与这个类相关的特征
类属性不会用于记录具体对象的特征

2.类方法:
就是针对类对象定义的方法
在类方法内部可以直接访问类属性或者调用其它的类方法
  

        简单来说,类属性和类方法实例(对象)的属性和方法 相似,主要是这个属性和方法的所属不同。

二、如何定义和使用类属性和类方法

类属性语法:

        使用赋值语句定义类属性

        通过 类名.类属性 的方式对类属性进行修改

下面通过实例演练帮助理解:

# 实例需求:
# 1.定义一个工具类
# 2.每件工具都有自己的 name
# 3.需求 -- 知道使用这个类,创建了多少个工具对象
class Tool(object):
    # 使用赋值语句定义类属性,记录所有工具对象的数量
    count = 0

    def __init__(self, name):
        self.name = name
        # 让类属性的值+1
        Tool.count += 1


# 创建工具对象
tool1 = Tool("斧头")
tool2 = Tool("榔头")
tool3 = Tool("水桶")

# 输出工具对象的总数
print("一共有 %s 个工具" % Tool.count)
print("一共有 %s 个工具" % tool1.count)

运行结果:

 看到这里可能会有一个疑问:

        在最后输出的时候,Tool.count 表示输出 Tool 这个类的 count 属性,那么 tool1.count 又代表什么呢?

 这时候就需要讲到属性的获取机制


属性的获取机制 -- 向上查找机制 -- (tool1.count) -- 先在对象内部查找对象属性, 没有找到就会向上寻找类属性
因此, 要访问类属性有两种方式:
        1.对象.类属性(不推荐)
        2.类名.类属性  

        由于会先在对象内部查找对象属性,因此,当类和(这个类的)对象有一个同名属性时,会调用对象的属性,这时调用出来的与我们所需要的类属性不一样,易造成错误和混乱。故不推荐对象.类属性 的方式调用类属性。

另外,在上述代码的下面添加几行代码,看看运行结果:

print("-" * 10)
# 注意: 如果使用 对象.类属性 = 值 赋值语句,只会给对象添加一个属性,而不会影响到 类属性的值
tool2.count = 99
print("此时输出的是类属性的count -- %s" % tool1.count)
print("此时输出的是新创建对象的属性 -- %s" % tool2.count)

由此可以知道:

在使用 对象.类属性 = 值 赋值语句的时候,只会为该对象添加属性,而不会影响到类属性的值。所以在使用类属性的时候,建议统一用 类名.类属性 = 值/表达式 的方法来对类属性进行定义或修改。

类方法语法:

       1.用以下语句进行类方法的定义

        @classmethod 

        def 类方法名(cls):

                pass

        2.用以下方法进行调用:

        通过 类名. 调用 类方法

        调用方法时,不需要传递cls参数 -- 类似self

        在方法内部:可以通过 cls. 访问类的属性

        也可以通过 cls. 调用其他的类方法

都类似于对象方法中利用 self. 来进行对象属性的访问和对象方法的调用

 下面通过实例演练帮助理解:

# 实例需求:
# 1.定义一个工具类
# 2.每件工具都有自己的 name
# 3.需求 -- 在 类 封装一个 show_tool_count 的类方法,输出使用当前这个类,创建的对象个数
class Tool(object):
    count = 0

    @classmethod
    def show_tool_count(cls):
        """显示工具对象的总数"""
        print("工具对象的总数 %d" % cls.count)

    def __init__(self, name):
        self.name = name
        Tool.count += 1


# 创建工具对象
tool1 = Tool("斧头")
tool2 = Tool("锄头")
tool3 = Tool("水桶")
# 调用类方法
Tool.show_tool_count()

运行结果:

 

三、在什么环境下使用

说了这么多,那么应该在什么环境下使用类属性和类方法呢?

其实早在第一部分就已经解答。

使用场景通常与其定义有关系,那我们来看看类属性的定义:

        通常用来记录与这个类相关的特征

        类属性不会用于记录具体对象的特征

即 该类所有对象都具有的相同的特征 可以用类属性进行记录

也可以像在实例演练中那样,充当计数的作用

另外可能有个疑问,既然用来记录对象的共同特征,那为什么不定义在对象属性上呢。

这就能看出类属性的一个优点了:

  • 实例属性要求每个对象为其单独开辟一份内存空间来记录数据,而类属性为全类所共有,仅占用一份内存,更加节省内存空间
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python学习——面向对象_类属性和类方法 的相关文章

  • 求100以内的偶数和

    一 文字描述 1 定义两个整型变量sum xff0c i xff1b 2 把0赋值给sum xff0c 2赋值给i xff1b 3 使sum 61 sum 43 i xff1b 4 如果i xff1c 61 100 xff0c 则返回第3步
  • 数据库总结(六):创建与使用存储过程

    目录 任务6 1 创建简单存储过程 1 PL SQL的变量 2 PL SQL的运算符及表达式 3 PL SQL的控制语句 4 MySQL的存储过程 任务6 2 创建带输入参数的存储过程 1 MySQL带输入参数的存储过程的创建 2 调用存储
  • 数据库总结(七):创建与使用触发器

    目录 任务7 1 创建触发器 1 触发器概述 2 创建触发器 任务7 2 查看及删除触发器 1 查看触发器 2 删除触发器 END 数据表中为了保证数据的完整性或执行其他特殊规则 xff0c MySQL除了提供约束之外 xff0c 还提供了
  • 数据库总结(8):数据库的安全性维护

    一 创建语句 1 添加数据库用户 insert into user host user password ssl cipher x509 issuer x509 subject values 主机号 用户名 password 密码 2 up
  • 『Java练习』面向对象程序练习

    编写一个类Calculate1 xff0c 实现加 减两种运算 xff0c 然后 xff0c 编写另一个派生类Calculate2 xff0c 实现乘 除两种运算 package object oriented development wo
  • C语言 冒泡法 比大小 从键盘输入10个整数,从他们从小到大输出的答案

    C语言 从键盘输入10个整数 xff0c 从他们从小到大输出的答案 方法 xff1a 冒泡法 通过举例子来介绍什么是冒泡法 xff0c 怎么比大小 xff1b 讲一下思路 xff1a 随便三个数 xff1a 5 xff0c 7 xff0c
  • 三点弯曲的有限元仿真

    0 概述 什么是三点弯曲 xff1f 三点弯曲变形有哪些特点 xff1f 三点弯曲仿真有哪些需要注意的地方 xff1f xff08 1 xff09 三点弯曲试验是将截面为矩形或圆形的试样放在弯曲装置上 xff0c 调整跨距 xff0c 在试
  • 视图篇——表格视图UITableView及控制器UITableViewController

    来自http www cnblogs com lovecode articles 2238309 html UITableViewController表格视图控制器 UITableViewController类继承自UIViewContro
  • JS 定时对象时,key加中括号表示什么意思

    对象key 加中括号是 取中括号中变量的内容 当做对象的key使用 xff0c 不加中括号 xff0c 则直接用该字符串当作对象的key 例如如下代码 xff1a var name 61 39 keyn 39 var a 61 name 3
  • 结构体案例2

    设计一个英雄的结构体 xff0c 包括成员姓名 xff0c 年龄 xff0c 性别 xff1b 创建结构体数组 xff0c 数组中存放5名英雄 通过冒泡排序 xff0c 将数组中的英雄按年龄进行升序排列 xff0c 最终打印排序后的结果 i
  • 第二周博客总结

    既然自己选择了学习算法 xff0c 便会一直坚持下去 xff0c 完成自己既定的目标 xff01 这一周下来 xff0c 按照自己既定的计划 xff0c 自己利用课余时间看深入浅出这本书 从第八章的初涉算法一直看到了第十七章的集合 xff0
  • 第四周ACM博客总结

    这一周基本对算法知识进行了一次细致的阅读 xff0c 自己也对算法知识有了更深一步的了解 这一周自己先将上周剩下的一点STL的内容补上了 xff0c 这些容器之间相似的地方有很多 xff0c 但都有各自的优点所在 xff0c 需要结合题目特
  • 第十四周DP算法总结

    这周自己主要再看DP算法的博客 xff0c 感觉DP这一部分内容确实比之前的都要麻烦一些 xff0c 最后攻克这一部分难题还是挺好的 这周自己总结了一些题型 xff0c 以及一些方法思路 xff0c 最后再把动态规划和之前的分治和贪心做一下
  • 深度理解卷积神经网络

    神经网络包括卷积层 xff0c 池化层 xff0c 全连接层 一个最简单的神经元结构 xff0c 假如有三个输入 xff0c 都对应一个权重参数 xff0c 然后通过权重加起来 xff0c 经过一个激活函数 xff0c 最后输出y CNN中
  • 花了半个多小时才发现的错误。。

    找了半天原来该写mapper的地方写成了service 结果光栈溢出 在找错误的过程中发现有些sql语句也写得不对 xff0c 单词拼错的 xff0c 后边多加逗号的 xff0c 某些html语句后边多写逗号的 64 Service pub
  • 找了1个多小时才发现的错误。。

    如果只是跟着课本敲 xff0c 那就肯定报错了 好久没碰有点生疏了 之前敲过一个类似的加载properties的文件的方法 xff0c 直接把课本的这个改成这个就可以解决500的错误了 注释的地方是行不通的错误代码 xff01 xff01
  • 1. Python 的 print( )输出函数

    1 Python 的 print 输出函数 文章目录 1 Python 的 print 输出函数1 什么是print 函数2 print 函数的语法3 英文输入法4 敲下你的第一行代码5 print 函数的4种用法5 1 没有引号5 2 单
  • c语言顺序表的基本操作

    该代码段包含了几种比较常见的顺序表的基本操作 xff0c 有 xff1a 求表长 xff0c 按位取值 xff0c 按值取位 xff0c 插入和删除几种方式 xff1b include lt stdio h gt define listsi
  • c语言单链表的基本操作

    该程序包含了链表的头插法 尾插法 求表长 按位查找 按值查找 插入 删除 销毁等几种操作 xff1b include lt stdio h gt include lt stdlib h gt malloc和free都需要这个系统库函数头文件
  • 文件操作(结构体)

    将结构体内容写入到文件中 include lt stdio h gt include lt string h gt struct student char name 100 int age int main struct student s

随机推荐

  • c语言顺序栈的基本操作

    该程序包含了顺序栈的置空 判断是否为空 判断是否为满 入栈 出栈和取栈顶元素等几种操作 xff1b include lt stdio h gt define size 100 typedef int datatype 假定栈元素的类型为in
  • c语言循环队列的基本操作

    该程序包含了置空 xff0c 判断是否为空 xff0c 入队 xff0c 出队 xff0c 取对头元素等几个基本操作 xff1b include lt stdio h gt include lt stdlib h gt malooc需要的头
  • c语言链队的基本操作

    该程序包含了链队的置空 判断是否为空 入栈 出栈和取栈顶元素几种基本操作 include lt stdio h gt include lt stdlib h gt malloc和free都需要这个系统库函数头文件 xff1b typedef
  • 十进制纯小数M转化成B进制数小数

    通过使用循环队列的方式将十进制纯小数M转化成B进制数 xff1b include lt stdio h gt include lt stdlib h gt malloc需要的头文件 xff1b define size 100 typedef
  • 十进制整数N转化成B进制整数

    通过使用顺序栈的方式将十进制整数N转化成B进制整数 xff1b include lt stdio h gt include lt stdlib h gt define size 100 typedef struct int data siz
  • redhat8安装ansible,Redhat8版本太低

    ansible因为更新的原因要安装Python3 9 Redhat8自带Python版本太低 耗费了一个多星期才解决 关闭防火墙和selinux 1 systemctl status firewalld 2 systemctl stop f
  • 从键盘输入10个整数,编程实现将其中最大数与最小数的位置对换后,再输出调整后的数组

    include lt stdio h gt void main int t 10 temp i max min max 61 0 min 61 0 for i 61 0 i lt 10 i 43 43 scanf 34 d 34 amp t
  • 枚举类型详解

    对于枚举类型 xff0c 想必不少的读者 xff0c 也是听过 xff0c 但是 xff0c 却没怎么见过如何使用 xff01 xff01 所以 xff0c 笔者打算用这一篇博客 xff0c 来详细的讲解一下 xff0c 枚举 xff01
  • 常用的几种布局方式---Flex 布局(垂直居中展示)

    常用的几种布局方式 Flex 布局 垂直居中展示 xff09 前言一 默认使用静态布局二 flex布局 1 父元素container1 1 display flex1 2 flex direction属性1 3 主轴与侧轴1 4 justi
  • Java中List排序的3种方法

    在某些特殊的场景下 xff0c 我们需要在 Java 程序中对 List 集合进行排序操作 比如从第三方接口中获取所有用户的列表 xff0c 但列表默认是以用户编号从小到大进行排序的 xff0c 而我们的系统需要按照用户的年龄从大到小进行排
  • 解密微信sqlite数据库

    最近在研究解密微信APP的数据库 xff0c 1 通过Android手机内置备份功能 xff0c 可以获取到微信的数据库文件 xff0c 再通过adb传到电脑上 2 获取微信EnMicroMsg db库的密码 xff08 通过IMEI和ui
  • conda 使用教程

    conda 使用教程 针对 ubuntu 20 04 ubuntu 20 04 是 西柚云 主要使用的操作系统 西柚云官网 文章目录 conda 使用教程虚拟环境管理channels 管理包管理配置管理 参考教程 xff1a conda 的
  • Shell脚本接收位置参数,变量的定义、分类和查看

    本文基于Linux上RedHat 8版本进行配置演示 一 从用户输入获取参数 1 通过 符号配合 数字等来获取 2 通过read xff08 p xff09 来获取 二 Shell中的变量 1 定义变量和查看变量 2 变量的分类和取消 一
  • docker Compose 下载安装

    在linux上 请注意 xff0c Compose standalone 使用 compose语法而不是当前的标准语法compose 例如docker compose up xff0c 在使用 Compose standalone 时键入
  • C++快读CF模板

    pragma GCC optimize 1 pragma GCC optimize 2 pragma GCC optimize 3 34 Ofast 34 34 inline 34 include lt bits stdc 43 43 h
  • 一个简单的学生信息管理系统的Python代码,使用Tkinter GUI库和MySQL数据库。

    以下是一个简单的学生信息管理系统的Python代码 xff0c 使用Tkinter GUI库和MySQL数据库 这个系统允许您添加 xff0c 更新 xff0c 删除和查看学生信息 在开始之前 xff0c 请确保你已安装必要的库 xff0c
  • 存储型XSS简介

    文章目录 一 存储型XSS简介 xff08 一 xff09 存储型XSS的概念 xff08 二 xff09 存储型XSS攻击过程 xff08 三 xff09 打XSS的潜在风险 二 XSS平台使用方法三 靶场实战 一 存储型XSS简介 xf
  • LINUX系统中MySQL8.0修改密码步骤

    1 程序报错 Your password does not satisfy the current policy requirements 译 xff1a 您的密码不符合当前策略要求 You must reset your password
  • 微软 Win快捷键大全

    1 Win 43 A 打开快速设置面板 快速设置面板是 Win11 新增加的一个模块 xff0c 可以完成一些常用功能 xff08 如 WIFI 飞行模式 投影 夜间模式 亮度 音量等 xff09 的快速启闭 Win 43 A 是这项功能的
  • Python学习——面向对象_类属性和类方法

    根据B站 黑马程序员 的python教程记录笔记 在前面的学习中 xff0c 我们已经知道 xff1a 使用面向对象开发 xff0c 第一步是设计类 使用 类名 创建对象 xff0c 而这个动作分为几步 xff1a 1 在内存中为对象分配空