Python3学习之路~6.3 类变量 VS 实例变量
类变量 VS 实例变量
#Author:Zheng Na # 实例里面可以查询、增加、删除、修改实例变量 class Role: # 类名
# 类变量
name = '我是类name'
n=1
n_list=[]
def __init__(self,name,role,weapon,life_value=100,money=15000):
# 构造函数
# 在实例化时做一些类的初始化的工作
# 开辟一块内存,将下面这些变量传进去
self.name = name # 实例变量(静态属性),作用域就是实例本身(r1和r2的实例变量不能共享)
self.role = role
self.weapon = weapon
self.life_value = life_value
self.money = money def buy_gun(self,gun_name): # 类的方法(动态属性)
print("%s just bought %s" %(self.name,gun_name)) def got_shot(self):
print("ah...I got shot...") print(Role.n) #1 在没有实例化之前,就可以打印类变量,说明类变量存放在类的内存里 r1 = Role("Alex","Policeman","AK47") # 生成一个角色,把一个类变成一个具体对象的过程叫实例化
r2 = Role("Jack","terrorist",'B22') r1.buy_gun("AK47") #Alex just bought AK47
r1.got_shot() #ah...I got shot... # 通过实例调用一个变量时,先在实例中寻找这个变量,如果找不到,再去类中寻找
print(r1.n) #1 实例化之后,通过实例对象也可以调用类变量(先去实例中寻找变量n,找不到,再去类中寻找,找到了!)
print(r1.name) #Alex 当实例变量与类变量同名时,先去找实例变量,再去找类变量 r1.name ='Rose' #实例化后再修改变量值,修改了实例变量
print(r1.name) #Rose
print(Role.name) #我是类name r1.bullet_prove = True # 实例化后可以再增加一个属性,仅给r1增加了属性,r2没有这个属性
print(r1.bullet_prove) # True # print(r1.weapon) # AK47
del r1.weapon # 可以删除属性
# print(r1.weapon) # 报错 r1.n="改类变量" # r1改了类变量,r2没改,内部实际上是在r1的内存里创建了一个新的变量,实际上不影响类变量本身
print(r1.n) # 改类变量
print(r2.n) # 1
print(Role.n) # 1 # 在类中修改变量,效果就是在类内存中存放的类变量由n=1变为n='ABC'
# 在实例r1调用变量n时,先在r1内存中寻找n,找到了,返回其值“改类变量”
# 在实例r2调用变量n时,先在r2内存中寻找n,没找到,再去类的内存中寻找n,此时类变量n的值已修改,于是返回修改后的值。
Role.n="ABC" #在类中修改变量
print(r1.n) # 改类变量
print(r2.n) # ABC # 当类变量为list时,无论实例r1或r2修改其值,改变的都是类变量的值,因为他们用的是同一个内存变量
r1.n_list.append("from r1")
r2.n_list.append("from r2")
print(Role.n_list) # ['from r1', 'from r2']
print(r1.n_list) # ['from r1', 'from r2']
print(r2.n_list) # ['from r1', 'from r2']
类变量的作用
类变量的作用就是保存大家共用的属性,节省开销(省内存)。
比如某一个系统中的所有用户均是中国人,那么国籍这个变量就可以写为类变量。
如下代码中的2个Person类所示,虽然最终结果时一样的,但是使用Person1类时,每实例化一个对象,就会开辟一块内存,传一个默认参数cn进去。中国有14亿人口,就会存14亿个参数,浪费内存。使用Person2类时,类变量cn仅存在于类的内存空间中,所有的实例均调用这个变量,节省开销。
#Author:Zheng Na class Person1:
def __init__(self,name,age,addr,cn="china"): #默认参数
self.name = name
self.age = age
self.addr = addr
self.cn = cn class Person2:
cn='china' #类变量
def __init__(self,name,age,addr):
self.name = name
self.age = age
self.addr = addr p1 = Person1("xiaoming",21,"山东")
print(p1.cn) # china p2 = Person2("xiaoming",21,"山东")
print(p2.cn) # china
Python3学习之路~6.3 类变量 VS 实例变量的更多相关文章
- Python3学习之路~8.2 socket简单实例 实现ssh 发送大量数据
实例1: 利用socket模拟客户端和服务器端各自收发一次数据: #Author:Zheng Na # 客户端 import socket # 声明socket类型,同时生成socket连接对象 cl ...
- Python3学习之路~0 目录
目录 Python3学习之路~2.1 列表.元组操作 Python3学习之路~2.2 简单的购物车程序 Python3学习之路~2.3 字符串操作 Python3学习之路~2.4 字典操作 Pytho ...
- Python基础-类变量和实例变量
Python基础-类变量和实例变量 写在前面 如非特别说明,下文均基于Python3 大纲: 1. 类变量和实例变量 在Python Tutorial中对于类变量和实例变量是这样描述的: Genera ...
- python的局部变量,全局变量,类变量,实例变量
定义: a.全局变量:在模块内.在所有函数外面.在class外面,这就是全局变量. b.局部变量:在函数内.在class的方法内(未加self修饰的),这就是局部变量. c. 静态变量:在class内 ...
- 牛客网Java刷题知识点之全局变量(又称成员变量,分为类变量和实例变量)、局部变量、静态变量(又称为类变量)
不多说,直接上干货! 定义类其实就是在定义类中的成员.成员:成员变量<-->属性,成员函数<-->行为. 局部变量在方法内部声明,并且只能在方法内部使用,在外层的方法被调用时被 ...
- Python类变量与实例变量及成员函数修饰方式说明(与Java定义方式进行类比)
Python类中的变量有类变量和实例变量之分. 类变量:变量绑定在类上,同一个类之间的共享变量,类比于Java中的静态变量static 公有变量定义 Java 的定义方式 class Test{ pu ...
- python中的实例方法、静态方法、类方法、类变量和实例变量
class MyTest: myname = 'peter' # add a instance attribute def __init__(self, name): self.n ...
- 【类不类二】Python的类变量与实例变量
在研究类的时候,难免会有很多疑问,C论坛和博客园高手如云(不知道是不是也美女如云), 搜到了这篇博文,是介绍Python的类变量和实例变量的 ! 刚好在下对self.***这种形式的实例变 量不是很理 ...
- Java中的类变量、实例变量、类方法、实例方法的区别
类变量:形如static int a; 顾名思义,类变量可以理解为类的变量,类变量在类加载的时候就已经给它分配了内存空间,不同于实例变量(int a; ),实例变量是在该类创建对象的时候分配内存的.并 ...
随机推荐
- [Bayes] Understanding Bayes: A Look at the Likelihood
From: https://alexanderetz.com/2015/04/15/understanding-bayes-a-look-at-the-likelihood/ Reading note ...
- 【代码审计】YUNUCMS_v1.0.6 前台反射型XSS跨站脚本漏洞分析
0x00 环境准备 QYKCMS官网:http://www.yunucms.com 网站源码版本:YUNUCMSv1.0.6 程序源码下载:http://www.yunucms.com/Downl ...
- MySql表结构修改详解
修改表的语法=========================增加列[add 列名]=========================①alter table 表名 add 列名 列类型 列参数[加的 ...
- 微信小游戏的本地缓存和清除的使用 (text.js image.js file-util.js)
参考: 微信小游戏,文件系统 UpdateManager-小游戏 一.Egret提供的本地缓存工具类( 备注:新版本进行了修改,并增加了sound.js等) 在微信小游戏项目中,Egret提供了fil ...
- go 的文件处理
准备一个文件 imooc.txt hello world! 一.使用 io/ioutil 包 定义一个 check 函数 func check(err error) { if err != nil { ...
- 利用System.Uri转URL为绝对地址
在使用ASPOSE.Word生成Word文档时可以通过InsertHtml(html)来将图文信息写入Word文档(图片内嵌),但要求html里图片的src是绝对全路径,所以需要对html进行转化. ...
- 爬虫----爬虫请求库requests
一 介绍 介绍:---------------------------------------------使用requests可以模拟浏览器的请求,比起之前用到的urllib,requests模块的a ...
- ES6 import
ES6标准发布后,module成为标准,标准的使用是以export指令导出接口,以import引入模块,但是在我们一贯的node模块中,我们采用的是CommonJS规范,使用require引入模块,使 ...
- [No0000177]详解/etc/profile、/etc/bash.bahsrc、~/.profile、~/.bashrc的用途
之前安装Linux的一些软件时,总要修改Linux的配置文件.当时也是一知半解.而且,网上有些安装教程,会说,修改配置文件后要重启Linux.但事实上是不需要重启的. Linux安装时可能要修改的配置 ...
- 今天重装系统后,Windows更新提示“windows update当前无法检查更新,因为未运行服务。您可能需要重新启动计算机”
到百度搜了常用的解决方法,就是用命令提示符,但对我的情况不管用,提示“拒绝访问”.后来在08绿软站的一篇文章中找到了解决办法.原文如下(我本人也是用的第四种方法解决的): 试了下面几种解决方法,第四种 ...