python 类的使用(2) 之类变量

python的类变量和成员变量用法实例教程 本文实例形式讲解了python的类变量和成员变量用法,对于Python程序设计有一定的参考价值。分享给大家供大家参考。具体如下: 先看看下面这段代码: class TestClass(object): val1 = 100 def __init__(self): self.val2 = 200 def fcn(self,val = 400): val3 ... 阅读详情

在这里插入图片描述

上一篇文章简要介绍了python类使用的基本框架,实际上已经简要介绍了类变量。本文再进一步介绍一下类变量相关的一些重要内容和类变量的使用。要注意一下类中定义的函数也叫方法哦,不要被搞懵了,因为我可能两种说法都在用。

讲的比较啰嗦,但是认真看的话会有收获的喔!

附上类使用专栏的其它文章的链接:


类变量

类变量就是某个类中定义的在类方法之外独立存在的变量,由于类变量不存在于某个函数中,因此可以直接在使用某个类的时候被调用。在调用某个类时还能够在类的外部重新定义类变量的值或者新增某些类变量;除此外类变量还能够被类中定义的方法所使用及改变。一眼看到这些语句可能会有点懵,咱们一个一个看例子吧:

基础的类变量被函数使用的例子

class Worker:   # 此处类命名也可以加上括号,不影响

    raise_percent = 1.05  
    # 这样在类中独立定义的变量就是类变量,可以被类本身或者类方法直接调用 (此处的意义是涨工资的比例)
    num_of_worker = 0     # 工人数量

    def __init__(self, name, salary):
        self.name = name
        self.salary = salary
        Worker.num_of_worker += 1     
        '''
        在初始函数init中调用类本身的类变量,此处的意思是每传入一次类实例,就会增加一个工作人员,
        也就是这里是对整个类来说的。而这里Worker.num_of_worker的Worker也最好不要使用self代替,
        使用self的意思不是很明确,因为self本身只代表一个类实例,其不能代表整个类的情况。
        '''

    def raise_salary(self):
        self.salary = self.salary * self.raise_percent
        '''
        这里的函数中传入了self,因此函数可以通过self.raise_percent获取到类变量,从而参与计算,
        这里的意义是将类实例传入的工资乘以上涨工资的比例从而将工资提升。
        当然要改变涨工资的比例即raise_percent这个类变量也是可以的,接下来会展示其它例子
        '''

A = Worker('Jack',1000)   # 传入一个类实例
print('Jack的初始工资:',A.salary)
print('涨工资的比例:',A.raise_percent)    # 打印查看类实例的类变量
A.raise_salary()          # 通过调用类中涨工资的函数给A实例涨工资
print('涨工资后Jack的工资是:',A.salary)           # 查看工资是否涨成功
print('工作人员数:',A.num_of_worker)    # 查看另一个类变量即工作人员数是否变化

运行上面代码的结果:

在这里插入图片描述
从这个结果中看出来,使用涨工资函数后,工资确实被涨了,工作人员数也从开始的0个变为了1个。应该也不需要什么解释啦。

在类的函数中改变类变量

使用类的时候,我们在某些函数调用后可能需要修改一下函数的类变量,这样的情况就可以在类函数中修改类的变量,其实使用方式很简单啦,就展示一下例子就好啦!

class Worker:   # 此处类命名也可以加上括号,不影响

    raise_percent = 1.05  

    def __init__(self, name, salary):
        self.name = name
        self.salary = salary

    def raise_salary(self):          # # 涨普通工资的方法
        self.salary = self.salary * self.raise_percent
        return self.salary

    def raise_higher_salary(self):    # 涨高工资的方法
        self.raise_percent = 1.08
        self.salary = self.salary * self.raise_percent
        return self.salary

    def raise_lower_salary(self):		# 涨低工资的方法
        self.raise_percent = 1.03
        self.salary = self.salary * self.raise_percent
        
A = Worker('Jack', 1000)
B = Worker('Mary', 1000)
C = Worker('Lucy', 1000)

A.raise_salary()
print('A涨薪后的工资:',A.salary)
print(A.raise_percent)
print(Worker.raise_percent)

B.raise_higher_salary()    # B涨的是高工资
print('B涨薪后的工资:', B.salary)
print(B.raise_percent)
print(Worker.raise_percent)

C.raise_lower_salary()     # C涨的是低工资
print('C涨薪后的工资:', C.salary)
print(C.raise_percent)
print(Worker.raise_percent)

结果:
在这里插入图片描述
这里简单解释一下,可以看到上面的工资都改变了,同时A、B、C三者的涨薪比例也都不一样了,但是可以看到Worker类的涨薪比例未改变,这表明了在类函数中修改的类变量仅在函数中生效,是局部变量,不影响整个类的类变量,那么你可能会想我如果想让类方法中修改的类变量在整个类中生效的话要怎么办呢,这就可以用到后续的类方法装饰器也即classmethod啦,使用nonlocal或者global好像有点问题,类方法在下一篇博客哦。

在外部调用类时改变类变量

还是使用上面的代码,不过这次增加一些工作人员:

class Worker:   # 此处类命名也可以加上括号,不影响

    raise_percent = 1.05  
    num_of_workers = 0     # 工人数量

    def __init__(self, name, salary):
        self.name = name
        self.salary = salary
        Worker.num_of_workers += 1     
        
    def raise_salary(self):
        self.salary = self.salary * self.raise_percent

A = Worker('Jack',1000)
B = Worker('Mary',1000)
C = Worker('Lucy',1000)

# 这里查看三个类实例是否是独立存在于内存中的
print(A)   
print(B)
print(C)

# 接下来查看在类外部修改类变量后的结果及对类的影响,即A、B的涨薪比例
print('初始涨工资的比例:',A.raise_percent)
A.raise_salary()
print('A涨薪后的工资:',A.salary)

B.raise_percent = 1.1
B.raise_salary()
print('B涨薪后的工资:',B.salary)
print('A的涨薪比例:',A.raise_percent,'C的涨薪比例',C.raise_percent)

# 这里通过类实例和类本身来查看类变量的变化情况
print('工作人员数:',A.num_of_workers) 
print('工作人员数:',B.num_of_workers)
print('工作人员数:',Worker.num_of_workers)

运行结果如下:
在这里插入图片描述
这里介绍一下上面的结果:

  • 首先打印三个类实例对象,可以看出它们在内存中存在的位置不同,因此他们并不代表同一个东西哦。
  • 首先类中的类变量即raise_percent默认设置为1.05,因此A在未调整涨薪比例的情况下涨的工资是在初始的比例下进行的,A涨薪后的工资就只有1050
  • 但是接下来我将B的涨薪比例提高到了1.1,这样对B使用涨薪函数后,B的工资涨到了1100,这是按照1.1的比例来得到的
  • 之后再尝试查看A和C的涨薪比例,两者没有发生变化,代表对B的类变量的改变没有影响到A和C的类变量
  • 但接下来查看工作人员数即num_of_workers,发现无论通过A、B或者是Worker类来查看得到的结果都是3。但是我实际上创建A、B、C三个类实例的时候是分开创建的,上面的内存位置也显示他们的储存位置不同,但这里他们的类变量却混用了。
  • 这是咋回事呢?经过查看网上的博客和反复思考,个人认为原因如此:由于A、B、C分开创建,它们各自的创建使用的类变量是公用的,也就是每创建一个类实例,整个类的类变量(包含类实例所能访问到的类变量)会被更新(init函数中设定的更新)。也就是说通过类创建的类实例都共用类变量,每次创建类实例时使用的类变量是上一次创建类实例更新后的类变量,而创建类实例后的类变量也就成为了之前所有类实例和整个类的类变量。这样也就能解释上面的现象了。而查看num_of_workers的内存地址也发现它们都是一样的(如下)。
    在这里插入图片描述
  • 但是上面的B的类变量raise_percent被改变了后为什么A与C的类变量raise_percent没有被改变呢?这是因为,在类外部对某个类实例拥有的类变量进行直接的修改相当于只改变了这个特定类实例的类变量属性,这是不会影响到其它的类实例和类变量的。即使不是直接修改,如使用A.num_of_worker += 1这样的方式也是只会改变A的类变量属性哦(可以自己试一下)。
  • 还有另外的一些情况在类外部操作类变量也不会改变整个类的类变量,那就是列表、集合、字典、自定义类等这些类变量,这些情况下的类变量也是可以在外部进行增删的操作的,但是要注意不能直接修改哦,修改的话就和上面修改类变量无异了。

看下例子:

class new_list:
    l = []

A = new_list()
B = new_list()
C = new_list()

A.l.append('yes')

print(A.l)
print(B.l)
print(C.l)

代码运行结果为:
在这里插入图片描述
而如果是改的情况:

class new_list:
    l = []

A = new_list()
B = new_list()
C = new_list()

A.l = 'no'

print(A.l)
print(B.l)
print(C.l)

结果如下:
在这里插入图片描述
这样就能看出来类变量若是是列表之类的形式,那么所有的类实例就都是共用一个内存地址了吧。以后一定不要搞混啦!

总结

感觉内容有点散,需要总结一下。

  • 首先类变量的定义,是在类中独立定义的不在类方法中的变量
  • 其次若无特殊情况(比如外部对类实例的修改等情况),所有创建的类实例都使用同一个共用的类变量,其在内存中的地址相同。
  • 在类的方法(即函数)中对类变量进行修改是不会影响到类本身的变量的,其修改仅在函数中局部有效。
  • 若某个类实例对类变量修改,那么只是这个实例的类变量被修改,其它类实例及类本身的类变量不改变。
  • 列表、字典等变量形式可以在不改变类变量的公用性的情况下进行增删操作,即某个类实例对列表或字典类的类变量进行增删操作是会同时操作到其它类实例的类变量的,它们使用的类变量是共用的。

叮!

最近忙呀,没啥时间写。今天的文章写的可能也不好,因为写的太冗长了,读起来可能较花时间。但是还是花功夫认真写了,若是认真读下来我觉得还是会有收获的。大家一起加油吧!

参考:https://blog.youkuaiyun.com/xuzhexing/article/details/93915962

参考:Corey Schafer的python视频教程

Python 3-2 类变量和实例变量 Python类变量和实例变量 1. 类对象和实例对象 1.1 类对象 Python中一切皆对象;类定义完成后,会在当前作用域中定义一个以类名为名字,指向类对象的名字。如 classDog: pass 会在当前作用域定义名字Dog,指向类对象Dog。 类对象支持的操作: 实例化:instance_name = class_name() 属性引用; class_name.attr_name 1.2 实例对象 实例对象是类对象实例化的产物,实例对象仅支持一个操作: 属性引... 阅读详情

相关推荐

2025年普通人转向人工智能运维(AIOps)学习建议(附最新技术实践与资源)

AIOps不仅是技术的叠加,更是运维流程的重构。建议通过“学习-实践-反馈”循环,逐步从工具使用者成长为解决方案设计者。如需完整资源链接,可访问上述推荐的优快云博客及GitHub仓库。

资深全栈架构师,乐于在 优快云 分享技术见解,与大家携手共进,共攀技术巅峰! 3095

python教程:python中什么是类方法,类变量及其使用的案例

class_variable = 0 # 类变量self.value = value # 实例变量class MyClass : class_variable = 0 # 类变量 def __init__(self , value) : self . value = value # 实例变量 @classmethod def class_method(cls) : cls . class_variable += 1 print(f"Class variable is now: {

keyboard专栏 1034

wireshark抓包分析TCP协议和用Fiddler抓包Https分析

wireshark抓包分析TCP协议和用Fiddler抓包Https分析 1.实验说明: 以某种游戏的客户端连接服务器、断开服务器为例,用wireshark抓包分析TCP协议的三次握手连接、四次握手断开,与计算机网络原理进行验证;用Fiddler抓包,分析验证一个HTTPS网站的TCP连接过程 2.实验过程: wireshark实验: (1)实验准备:安装《洛克王国》游戏客户端, 运行洛克王国客户端,打开内存资源管理器查看PID 根据PID查看洛克王国服务端的IP地址和端口号 并打开命令行运行以下命令: n

qq_42032327的博客 1257

Python类变量和实例变量(类属性和实例属性)

Python类变量和实例变量(类属性和实例属性) <Python selfPython实例方法、静态方法和类方法> C语言中文网推出辅导班啦,包括「C语言辅导班、C++辅导班、算法/数据结构辅导班」,全部都是一对一教学:一对一辅导 + 一对一答疑 + 布置作业 + 项目实践 + 永久学习。QQ在线,随时响应! 无论是类属性还是类方法,都无法向普通变量或者函数那样,在类的...

1326

数字孪生在智慧医疗中的5个创新应用:从手术模拟到个性化治疗

数字孪生技术通过创建患者或医疗流程的动态虚拟映射,正在深刻变革智慧医疗。本文重点剖析了其在个性化治疗、手术模拟与导航、药物研发、医院管理优化及慢性病管理五大核心场景的创新应用,展现了如何利用智能映射与数据融合,为精准医疗和高效决策提供强大支持。

weixin_29189003的博客 443

解决RuntimeError: Couldn‘t load custom C++ ops. This can happen if your PyTorch

刚下好yolov8的代码,想测一下能否成果,果然没成功,报错如下简单来说就是torchvision和torch不匹配,就很离谱,我照着版本对应关系pip install的啊,怎么会不匹配建议先看看你的版本我是下图红框这个首先确定自己torch没问题,因为我的3090这个卡目前cuda版本是11.1,这个whl是早就下好的,一般1-2G,有问题重新下就麻烦了然后我pip install了很多次torchvision==0.11.3,都没啥用。想试着改改版本,结果要下其他的torch版本,就更不可能了。

DZY的博客 2247

Python 实例变量和类变量(Instance Variables & Class Variables)

在Python面向对象编程中,理解实例变量和类变量的区别至关重要。这两种变量虽然都用于存储数据,但它们的用途、生命周期和作用范围却大不相同,本文将解释这两种变量的区别,并通过示例代码展示它们的使用方法。

最简单的方法,解决最实际的问题。 960

【技术解析】LUT-Fuse:如何通过可学习查找表与蒸馏技术,为边缘设备解锁实时图像融合

本文解析了ICCV 2025提出的LUT-Fuse技术,它通过可学习查找表与知识蒸馏,解决了边缘设备上图像融合的质量、速度与功耗“不可能三角”。该方法将复杂计算预编译为高速查找表,在Jetson等设备上实现100+ FPS的实时红外-可见光图像融合,为无人机、安防等应用提供了高效解决方案。

code8的博客 495

类变量基本使用

类变量和类方法 1. 类变量-提出问题 有一群小孩在玩堆雪人,不时有新的小孩加入,请问如何知道现在共有多少人在玩?,编写程序解决。 2. 传统的方法来解决 思路 在main方法中定义一个变量count 当一个小孩加入游戏后count++,最后个count 就记录有多少小孩玩游戏 ...

兮动人 1272

WRF实战:自定义Vtable解析ECMWF海温数据的关键步骤与技巧

本文详细介绍了在WRF模型中自定义Vtable以解析ECMWF海温数据的关键步骤与技巧。通过解剖GRIB文件、编写自定义Vtable条目以及配置METGRID.TBL,解决了ECMWF数据与WRF模型对接的难题,为海洋气象和台风模拟研究提供了高精度数据输入方案。

weixin_29279101的博客 335

【Python基础】FastAPI 从入门到项目实战操作详解

【Python基础】FastAPI从入门到使用实战操作详解

congge_study的博客 437

类变量和类方法

语法:访问修饰符 static 数据类型 变量名;[推荐]static 访问修饰符数据类型 变量名;

well_KD的博客 1545

G120变频器抱闸逻辑在提升机上应用

一、前言: 对于提升机、起重机、堆垛机、升降机等提升机构,负载为位能性负载,在设备启动和停止阶段,由于重物作用,可能会出现“溜车”现象、控制变频器与电机抱闸时许可以解决此问题 使用具有矢量控制功能的变频器 二、参数设置 抱闸控制时序: 启动: 1、变频器接收到启动命令时-----输出电流对电机进行励磁,经过P346电机励磁时间(==丹佛斯 设置启动电流延时0.5S)------达到一定的转矩 2、变频器输出开抱闸命令,经过P1216延时打开抱闸时间(==PLC延时控制打开抱闸) 注意:抱闸

fenglingxicao的博客 1万+

Python类变量和实例变量区别

类变量:可在类的所有实例之间共享的值(也就是说,它们不是单独分配给每个实例的)。 实例变量:实例化之后,每个实例单独拥有的变量。 class student(): age = 0 name = 'stu' # age,name是类变量 def __init__(self,age,name): self.age = age self.n...

xxx 1万+

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

python 类的使用(1) 之类使用的基本框架

我觉得Python的使用可以分三个阶段:1.直接写代码阶段,即一行一行的运行,没有任何函数。2.开始使用函数式编程。3.开始使用类。 类对于python来说真的非常好用,类不仅仅是在大型工作中可以用,即使在小型工作中也能够使用,使代码易于重用,易于构建,易于修改等等。快快使用或者学习起来吧! 本文将会分几个部分来对类的使用细化讲解,内容通俗易懂,希望能帮助到大家!

keepaware的博客 1667

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

python的类变量和成员变量

先看看python类的类变量和成员变量。见下面代码: class TestClass(object): val1 = 100 def __init__(self): self.val2 = 200 def fcn(self,val = 400): val3 = 300 self.val4 = val

hujing_Liu 3万+

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Python类中变量定义详解

Python中的类可以定义两种类型的变量:类变量和实例变量。类变量(Class Variables): 类变量是在类级别上定义的变量,它们是对所有实例共享的。这意味着类变量只有一个副本,无论你创建了多少个类的实例,类变量的值都是相同的。如果你通过任意一个实例或者类本身改变了类变量的值,这个改变对所有实例都是可见的。

Summer的博客 4146

python类变量的使用_python 类变量

在使用python之前一直是使用java的,对于java类中的变量概念比较牢固,所以在迁移到python中只有一直有一点云山雾绕的,在某段时间一直不敢在类中定义变量。一直到昨天深入的理解了一下python类变量的定义,终于有一些理解。先从我最熟悉的java开始,先上代码1 /**2 * Created by tangrubei on 2018/1/4.3 */4 public class Va...

weixin_39819283的博客 290

Python的类变量、实例变量

参考: Python类变量和实例变量(类属性和实例属性)在类体中,根据变量定义的位置不同,以及定义的方式不同,类属性又可细分为以下 3 种类型:类变量指的是在类中,但在各个类方法外定义的变量。举个例子: 上面程序中,name 和 add 就属于类变量。类变量的特点是,所有类的实例化对象都同时共享类变量,也就是说,类变量在所有实例化对象中是作为公用资源存在的。类方法的调用方式有 2 种,既可以使用类名直接调用,也可以使用类的实例化对象调用。比如,在 CLanguage 类的外部,添加如下代码: 程序运行结果为

sally的jerry 2276

python中类变量和实例变量详解

python中类变量和实例变量详解 在了解类变量和实例变量之前,首先要知道类变量和实例变量的定义。 类变量:可在类的所有实例之间共享的值,就是指不是单独分配给每个实例,实例可以调用类变量。 实例变量:实例化之后,每个实例单独拥有的变量,类不能直接调用实例变量。 一、基础的类变量和实例变量 如下示例:num代表类变量,name代表实例变量。 class Test(object): num=0 def __init__(self,name): self.name=name

qq_42486675的博客 1万+

python(类和对象之类属性和类变量)

类属性 类变量 #1.类属性、类变量、只能由类调用的属性 class People(object): #类变量可以由所有的对象访问,但是对象只能访问,不可修改 #用来做资源共享 total = 0 name = 'python8期' #初始化函数,添加对象属性 def __init__(self,name,age,school):

博客小白 4486

Python 类继承之类变量和类方法的用法

本页主要讨论python中的类继承时的类变量的套路 class Displayer(object): name = None @classmethod def get_name(cls): print 'In the get_name' print 'cls.name = {0}'.format(cls.name) ------- 有...

cpxsxn的博客 949

python之类变量的使用场景

类变量(Class Variable)是属于类本身的变量,而非类的实例,它存储在类的命名空间中,所有类的实例共享同一个类变量的引用,而非每个实例拥有独立副本。与之相对的是实例变量(Instance Variable),实例变量属于单个实例,存储在实例的命名空间中,每个实例拥有独立的副本。类变量的本质是:类作为对象(Python 中一切皆对象,类是type的实例)的属性,因此类变量也可称为 “类属性”。在类体中直接定义(不在任何方法内),无需self# 类变量:属于 MyClass 类本身。

cosseen的专栏 342

python的类变量和实例变量_python之面向对象之类变量和实例变量

#Auther Bob#--*--conding:utf-8 --*--#这里的变量全部都是实例变量class Role(object):def __init__(self,name,role,wepon,life_value):#实例变量self.name = nameself.role = roleself.wepon = weponself.life_value = life_value#类...

weixin_39851457的博客 91

Python之类变量的纷争

类变量与实例变量 类变量:在类空间或通过类引用赋值的变量 实例变量:通过对象引用或self引用赋值的变量 类、对象可访问类变量 通过类,可获取、修改类变量的值 通过对象,可获取类变量的值 如果尝试通过对象对”类变量“赋值,就变成了新增实例变量 类不能访问实例实例变量 实例变量不在类空间下,类不能访问实例变量 class User: #类空间中定义的变量,是类变量 categroy ...

weixin_42725911的博客 502
上一篇: python 类的使用(1) 之类使用的基本框架
下一篇: 在linux中创建快捷方式(使用硬链接或软链接)
你大佬来啦
博客等级 码龄7年 322粉丝 62原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值