python 类可以调用实例变量_python面向对象中类对象、实例对象、类变量、实例变量、类方法、实例方法、静态方法...

1. 类对象和实例对象

Python中一切皆对象,Python类本身也是一种对象,类定义完成后,会在当前作用域中定义一个以类名为名字的命名空间。类对象具有以下两种操作:

可以通过“类名()”的方式实例化一个对象。

可以通过“类名.类属性”的方式来访问一个类属性。

如果说类时一种概念性的定义,是一种类别,那么实例对象就是对这一类别的具体化、实例化,即实例化对象是类对象实例化之后的产物。

class Person:#声明一个类对象

passp1= Person()#声明一个实例对象

print(Person)#输出结果:

print(p1)#<__main__.Person object at 0x0000015F7F94D0F0>

2 类变量与实例变量

2.1 概念上的区别

类变量是指是指该类的所有实例说共有的数据,实例变量是该类每一个实例所特有的数据。这么说的话可能还是很抽象,我们拿人类(Person类)来打比方,人类能移动(move=True),这是每一个人(张三、李四)都能做的,所以我们可以说人类能移动,张三能移动,李四也能移动,这里的移动(move)就是一个类变量。但每一个人都可能有不同的姓名(name)和年龄(age),张三可能20岁,李四可能30岁,但是我们不能说人类(Person)都是20岁或30岁,这里的姓名(name)和年龄(age)就是实例变量。

classPerson:

move= True #这是类变量

def __init__(self , name , age):

self.name= name #这是实例变量

self.age= age #这是实例变量

2.2 声明上的区别

类变量声明通常在类内部,但函数体外,不需要用任何关键字修饰。实例变量一般声明在实例方法内部(其他方法内部也不行),且用self关键字修饰。

classPerson:

move= True #这是类变量,

def __init__(self , name):

self.name= name #这是实例变量,必须声明在实例函数内,用self关键字修饰

#move = True # 类变量不能再函数体内声明,在这个位置声明的又没有self关键字修饰,只能是一个局部变量

#self.age = age # 这是错误的,实例变量不能再这里声明

eat= True #这是类变量,可以在函数体外,类内部任意位置

上面的变量绑定都是在对象声明过程中绑定的,但事实上类变量和实例变量都可以在类或者实例都可以在对象声明结束之后再绑定。“类名.变量名”绑定的是类变量,“实例名.变量名”绑定的是实例变量。

classPerson:

move=Truedef __init__(self , name , age):

self.name=name

self.age=age

p1= Person('张三' , 20)

p1.gender='男' #声明实例对象结束之后再绑定一个实例变量

Person.eat= True #声明类对象结束之后再绑定一个类变量

print(p1.gender) #输出结果:男

print(p1.eat) #输出结果:True

注:虽然可以在对象声明之后再绑定对象,但是这种方式最好不要使用。

2.3 访问上的区别

类变量可以通过“类名.变量名”和“实例名.变量名”的方式访问。实例变量只能通过“实例名.变量名”的方式来访问。

classPerson:

move= True #这是类变量

def __init__(self , name , age):

self.name= name #这是实例变量

self.age= age #这是实例变量

p1= Person('张三' , 20)print(p1.name , p1.age) #通过“实例名.变量名”的方式访问实例变量

print(p1.move) #通过“实例名.变量名”的方式访问实例变量

print(Person.move) #通过“类名.变量名”方式访问类变量

#print(Person.name) # 这是错误的

注:虽然可以通过“实例名.类变量名”的方式访问类变量,但是并不推荐,最好还是通过“类名.类变量名”来访问类变量。

2.4 存储上的区别

类变量只会在用class关键字声明一个类时创建,且也只会保存在类的命名空间中,这个类的实例的命名空间中是没有的。通过“实例名.类变量名”访问类变量时,实际访问的是类命名空间中数据,所以所有实例访问到的数据都是同一个变量。实例变量保存在实例各自的命名空间中。

classPerson:

move= True #这是类变量

def __init__(self , name , age):

self.name= name #这是实例变量

self.age= age #这是实例变量

p1= Person('张三' , 20)

p2= Person('李四' , 30)#通过id()函数查询move内存地址

print(id(p1.move)) #输出结果为:1622667424

print(id(p1.move)) #输出结果为:1622667424

3 静态方法、类方法、实例方法

3.1 静态方法

静态方法是指在定义时,使用@staticmethod装饰器来修饰,无序传入self或cls关键字即可进行创建的方法。在调用过程时,无需将类实例化,直接通过“类名.方法名()”方式调用方法。当然,也可以在实例化后通过“实例名.方法名()”的方式调用。在静态方法内部,只能通过“类名.类变量名”的方式访问类变量。

classPerson:

move=Truedef __init__(self , name , age):

self.name=name

self.age=age

@staticmethoddef static_fun(): #声明一个静态方法

print(Person.move)

p1= Person('张三' , 20)

p1.static_fun()#输出结果:这是静态方法

Person.static_fun()#输出结果:这是静态方法

3.2 类方法

类方法需要使用@classmethod装饰器来修饰,且传入的第一个参数为cls,指代的是类本身。类方法在调用方式上与静态方法相似,即可以通过“类名.方法名()”和“实例名.方法名()”两种方式调用。但类方法与静态方法不同的是,类方法可以在方法内部通过cls关键字访问类变量。在类方法内部,既能通过“类名.类变量名”的方式访问类变量,也能通过“cls.类变量名”的方式访问类变量。

classPerson:

move=Truedef __init__(self , name , age):

self.name=name

self.age=age

@classmethoddef class_fun(cls): #声明一个类方法

print(cls.move)print(Person.move)#cls 指的就是Person类,等效

p1= Person('张三' , 20)

p1.class_fun()#输出结果:True True

Person.class_fun()#输出结果:True True

3.3 实例方法

在一个类中,除了静态方法和类方法之外,就是实例方法了,实例方法不需要装饰器修饰,不过在声明时传入的第一个参数必须为self,self指代的就是实例本身。实例方法能访问实例变量,静态方法和类方法则不能。在实例方法内部只能通过“类名.类变量名”的方式访问类变量。在调用时,实例方法可以通过“实例名.实例方法名”来调用,如果要通过类来调用,必须必须显式地将实例当做参数传入。

classPerson:

move=Truedef __init__(self , name , age):

self.name=name

self.age=agedef instance_fun(self): #声明一个实例方法

print(Person.move) #访问类变量

print(self.name , self.age)

p1= Person('张三' , 20)

p1.instance_fun()

Person.instance_fun(p1)#通过类访问实例方法时,必须显式地将实例当做参数传入

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

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

相关文章

python主成分分析法降维_主成分分析降维(MNIST数据集)

今天看了用主成分分析简化数据&#xff0c;就顺便用MNIST数据集做了下实验&#xff0c;想直观地看一下效果&#xff0c;并通过完成这个小demo深入理解下原理。我发现“是什么、能做什么、怎么用、效果是什么、原理是什么、优缺点是什么”这样的思路能让我更好地接受一个新知识&…

ARIMA加法季节模型

目录 ARIMA加法季节模型 ARIMA加法季节模型函数 例题 ARIMA加法季节模型 季节效应和其它效应之间是加法关系 通过简单的趋势差分、季节差分之后转化为平稳&#xff0c;模型结构通常如下 ARIMA加法季节模型函数 例题 部分数据&#xff1a; timexJan-93977.5Feb-93892.5Mar…

Java在远程方法调用中运用反射机制

我们将介绍反射机制在网络编程中的应用&#xff0c;实现如何在客户端通过远程方法调用服务器端的方法。 假定在服务器端有一个 HelloService 接口&#xff0c;该接口具有 getTime() 和 echo() 方法&#xff0c;具体代码如下&#xff1a; import java.util.Date;public interf…

安捷伦频谱仪的使用方法图解_频谱仪的简单操作使用方法lbrack;1rsqb;

R3131A频谱仪简单操作使用方法一&#xff0e;R3131A频谱仪简介。R3131A频谱仪是日本ADVANTEST公司的产品&#xff0c;用于测量高频信号&#xff0c;可测量的频率范围为9K—3GHz。对于GSM手机的维修&#xff0c;通过频谱仪可测量射频电路中的以下电路信号, (维修人员可以通过对所…

多元时间序列分析 —— 因果检验

目录 因果检验 因果关系的识别 例 Granger 因果关系定义 两变量之间的4种因果关系 Granger因果检验 1.假设条件 2.检验统计量 例 进行Granger因果检验应该注意的问题 因果检验 因果关系的识别 对于多元时间序列而言&#xff0c;如果能找到对响应变量有显.著影响的输…

华为仿苹果字体_华为mate40系列再次霸榜DXO,网友:无敌是多么寂寞

阅读本文前&#xff0c;请您先点击上面的蓝色字体&#xff0c;再点击“关注”&#xff0c;这样您就可以免费收到最新内容了。每天都有分享&#xff0c;完全是免费订阅&#xff0c;请放心关注。声明&#xff1a;本文转载自网络&#xff0c;如有侵权&#xff0c;请在后台留言联系…

Java常见异常处理

异常&#xff08;exception&#xff09;是在运行程序时产生的一种异常情况&#xff0c;已经成为了衡量一门语言是否成熟的标准之一。 异常简介 Java 中的异常又称为例外&#xff0c;是一个在程序执行期间发生的事件&#xff0c;它中断正在执行程序的正常指令流。为了能够及时…

干预分析 + 伪回归

目录 干预分析 干预分析的定义 干预分析的产生背景 干预分析的实质 干预分析步骤 步骤一 步骤二 步骤三 步骤四 步骤五 步骤六 干预机制的选择 伪回归 定义 伪回归随机模拟试验 伪回归产生原因 干预分析 干预分析的定义 时间序列常常受到某些外部事件的影响…

R如何安装MSBVAR包!!!请看这里!!

目录 1.MSBVAR介绍 2.为何R上安装失败 3.解决方案 1.MSBVAR介绍 MSBVAR: 估计贝叶斯向量自回归模型和贝叶斯结构向量自回归模型&#xff0c;也可以用于时间序列的因果检验。 2.为何R上安装失败 MSBVAR现在不属于R中的库&#xff0c;属于第三方安装库&#xff0c;并且它在…

easy excel根据行列excel_Excel函数如何根据地级市匹配所在省份计算快递费用

前些日子一个学员问的关于excel计算快递费的问题&#xff0c;office小超老师觉得很有代表性。在这里和大家分享一下具体处理快递费的处理流程。在她的这个案例中&#xff0c;订单信息地区仅为各个地级市&#xff0c;现在的问题就是要根据不同的地级市和各个地区不同的快递费用&…

Java中Error和Exception的异同

Error&#xff08;错误&#xff09;和 Exception&#xff08;异常&#xff09;都是 java.lang.Throwable 类的子类&#xff0c;在 Java 代码中只有继承了 Throwable 类的实例才能被 throw 或者 catch。 Exception 和 Error 体现了 Java 平台设计者对不同异常情况的分类&#x…

智能计算之遗传算法(GA)介绍

目录 1. 简介 2. GA思想来源及建立过程 3. 研究发展 4. GA的基本结构 5. GA的实现流程 (1) 染色体编​辑 (2) 群体的初始化 (3) 适应值评价 (4) 选择算子(父体选择) (5) 交配算子(杂交算子) (6) 变异算子 (7) 算法流程 6. 实例举例 7. 遗传算法的改进 (1) 算子的…

sublimetext3插件安装_sublime text 3 交互python

爱折腾的我最近在用sublime text 3 写python&#xff0c;但是原生态的编译模式不支持交互。在网上找了许多资料&#xff0c;想要可以交互运行python&#xff0c;大都需要sublimeREPL这个插件&#xff0c;我不想用这个插件。在多次摸索过后找到了如下解决方案&#xff0c;在此记…

如何用手机打开dcm格式图片_压缩图片用这个神奇吧(电脑版)

一码不扫&#xff0c;可以扫天下&#xff1f;Light Image Resizer是将数码照片和图像存在电脑中&#xff0c;并希望重新调整图片大小&#xff0c;压缩&#xff0c;转换&#xff0c;创建备份&#xff0c;导入或组织图片的人们设计的完美工具。Light Image Resizer 专业的图像缩放…

智能计算之神经网络(BP)介绍

目录 1. 神经网络流行原因 2. 人工神经网络定义 3. 人工神经网络的学习能力 4. 人工神经网络的基本原理 5. 神经网络的研究进展 6. 神经网络的典型结构 6.1 单层感知器网络 6.2 前馈型网络 6.3 前馈内层互联网络 6.4 反馈型网络 6.5 全互联网络 7. 神经网络的学习算…

python系统关键字_Python基础教程 - global关键字及全局变量的用法

Python中global关键字主要作用是声明变量的作用域。 在C语言中&#xff0c;由于变量一定是先声明&#xff0c;后使用&#xff0c;所以我们可以清楚的知道&#xff0c;现在使用的变量是全局还是局部&#xff0c;比如&#xff1a; int a 5; void test(void) { a 1; // 没有先声…

如何查看keepalived版本号_Keepalived介绍 , 配置说明 , 及实际应用

1. Keepalived介绍Keepalived是一个基于VRRP协议来实现的服务高可用方案&#xff0c;可以利用其来避免IP单点故障&#xff0c;类似的工具还有heartbeat、corosync、pacemaker。但是它一般不会单独出现&#xff0c;而是与其它负载均衡技术(如lvs、haproxy、nginx)一起工作来达到…

智能计算之神经网络(Hopfield网络-DHNN,CHNN )介绍

目录 1. 神经网络受欢迎的原因 2. 人工神经网络定义 3. 人工神经网络的学习能力 4. 人工神经网络的基本原理 5. 神经网络的研究进展 6. 神经网络的典型结构 6.1 单层感知器网络 6.2 前馈型网络 6.3 前馈内层互联网络 6.4 反馈型网络 6.5 全互联网络 7. 神经网络的学…

用python画渐变的圆_使用numpy绘制圆形渐变

由于对称性&#xff0c;实际上只需要计算图像256*256的四分之一&#xff0c;即64*64&#xff0c;然后将其逐块旋转90度&#xff0c;然后将它们组合起来。这样&#xff0c;总时间是计算256256像素的1/4倍。在 以下是示例。在import numpy as np import matplotlib.pyplot as plt…

发那科程序全部输出_如何拷贝FANUC系统全部程序

在SETTING画面复I/O通道一项中设定I/O4(或者制20#参数改为4)&#xff0c;将存储卡(插在机床的面板上的PCMCIA接口里。选择编辑模式&#xff0c;程序钥匙锁打开&#xff0c;全部程序预览页面(列表)&#xff0c;点击(操作)&#xff0c;点击右扩展键&#xff0c;点击(F输出)&#…