类变量 VS 实例变量

  1. #Author:Zheng Na
  2.  
  3. # 实例里面可以查询、增加、删除、修改实例变量
  4.  
  5. class Role: # 类名
  6. # 类变量
  7. name = '我是类name'
  8. n=1
  9. n_list=[]
  10. def __init__(self,name,role,weapon,life_value=100,money=15000):
  11. # 构造函数
  12. # 在实例化时做一些类的初始化的工作
  13. # 开辟一块内存,将下面这些变量传进去
  14. self.name = name # 实例变量(静态属性),作用域就是实例本身(r1和r2的实例变量不能共享)
  15. self.role = role
  16. self.weapon = weapon
  17. self.life_value = life_value
  18. self.money = money
  19.  
  20. def buy_gun(self,gun_name): # 类的方法(动态属性)
  21. print("%s just bought %s" %(self.name,gun_name))
  22.  
  23. def got_shot(self):
  24. print("ah...I got shot...")
  25.  
  26. print(Role.n) #1 在没有实例化之前,就可以打印类变量,说明类变量存放在类的内存里
  27.  
  28. r1 = Role("Alex","Policeman","AK47") # 生成一个角色,把一个类变成一个具体对象的过程叫实例化
  29. r2 = Role("Jack","terrorist",'B22')
  30.  
  31. r1.buy_gun("AK47") #Alex just bought AK47
  32. r1.got_shot() #ah...I got shot...
  33.  
  34. # 通过实例调用一个变量时,先在实例中寻找这个变量,如果找不到,再去类中寻找
  35. print(r1.n) #1 实例化之后,通过实例对象也可以调用类变量(先去实例中寻找变量n,找不到,再去类中寻找,找到了!)
  36. print(r1.name) #Alex 当实例变量与类变量同名时,先去找实例变量,再去找类变量
  37.  
  38. r1.name ='Rose' #实例化后再修改变量值,修改了实例变量
  39. print(r1.name) #Rose
  40. print(Role.name) #我是类name
  41.  
  42. r1.bullet_prove = True # 实例化后可以再增加一个属性,仅给r1增加了属性,r2没有这个属性
  43. print(r1.bullet_prove) # True
  44.  
  45. # print(r1.weapon) # AK47
  46. del r1.weapon # 可以删除属性
  47. # print(r1.weapon) # 报错
  48.  
  49. r1.n="改类变量" # r1改了类变量,r2没改,内部实际上是在r1的内存里创建了一个新的变量,实际上不影响类变量本身
  50. print(r1.n) # 改类变量
  51. print(r2.n) # 1
  52. print(Role.n) # 1
  53.  
  54. # 在类中修改变量,效果就是在类内存中存放的类变量由n=1变为n='ABC'
  55. # 在实例r1调用变量n时,先在r1内存中寻找n,找到了,返回其值“改类变量”
  56. # 在实例r2调用变量n时,先在r2内存中寻找n,没找到,再去类的内存中寻找n,此时类变量n的值已修改,于是返回修改后的值。
  57. Role.n="ABC" #在类中修改变量
  58. print(r1.n) # 改类变量
  59. print(r2.n) # ABC
  60.  
  61. # 当类变量为list时,无论实例r1或r2修改其值,改变的都是类变量的值,因为他们用的是同一个内存变量
  62. r1.n_list.append("from r1")
  63. r2.n_list.append("from r2")
  64. print(Role.n_list) # ['from r1', 'from r2']
  65. print(r1.n_list) # ['from r1', 'from r2']
  66. print(r2.n_list) # ['from r1', 'from r2']

类变量的作用

类变量的作用就是保存大家共用的属性,节省开销(省内存)。
比如某一个系统中的所有用户均是中国人,那么国籍这个变量就可以写为类变量。
如下代码中的2个Person类所示,虽然最终结果时一样的,但是使用Person1类时,每实例化一个对象,就会开辟一块内存,传一个默认参数cn进去。中国有14亿人口,就会存14亿个参数,浪费内存。使用Person2类时,类变量cn仅存在于类的内存空间中,所有的实例均调用这个变量,节省开销。

  1. #Author:Zheng Na
  2.  
  3. class Person1:
  4. def __init__(self,name,age,addr,cn="china"): #默认参数
  5. self.name = name
  6. self.age = age
  7. self.addr = addr
  8. self.cn = cn
  9.  
  10. class Person2:
  11. cn='china' #类变量
  12. def __init__(self,name,age,addr):
  13. self.name = name
  14. self.age = age
  15. self.addr = addr
  16.  
  17. p1 = Person1("xiaoming",21,"山东")
  18. print(p1.cn) # china
  19.  
  20. p2 = Person2("xiaoming",21,"山东")
  21. print(p2.cn) # china

  

 

Python3学习之路~6.3 类变量 VS 实例变量的更多相关文章

  1. Python3学习之路~8.2 socket简单实例 实现ssh 发送大量数据

    实例1: 利用socket模拟客户端和服务器端各自收发一次数据: #Author:Zheng Na # 客户端 import socket # 声明socket类型,同时生成socket连接对象 cl ...

  2. Python3学习之路~0 目录

    目录 Python3学习之路~2.1 列表.元组操作 Python3学习之路~2.2 简单的购物车程序 Python3学习之路~2.3 字符串操作 Python3学习之路~2.4 字典操作 Pytho ...

  3. Python基础-类变量和实例变量

    Python基础-类变量和实例变量 写在前面 如非特别说明,下文均基于Python3 大纲: 1. 类变量和实例变量 在Python Tutorial中对于类变量和实例变量是这样描述的: Genera ...

  4. python的局部变量,全局变量,类变量,实例变量

    定义: a.全局变量:在模块内.在所有函数外面.在class外面,这就是全局变量. b.局部变量:在函数内.在class的方法内(未加self修饰的),这就是局部变量. c. 静态变量:在class内 ...

  5. 牛客网Java刷题知识点之全局变量(又称成员变量,分为类变量和实例变量)、局部变量、静态变量(又称为类变量)

    不多说,直接上干货! 定义类其实就是在定义类中的成员.成员:成员变量<-->属性,成员函数<-->行为. 局部变量在方法内部声明,并且只能在方法内部使用,在外层的方法被调用时被 ...

  6. Python类变量与实例变量及成员函数修饰方式说明(与Java定义方式进行类比)

    Python类中的变量有类变量和实例变量之分. 类变量:变量绑定在类上,同一个类之间的共享变量,类比于Java中的静态变量static 公有变量定义 Java 的定义方式 class Test{ pu ...

  7. python中的实例方法、静态方法、类方法、类变量和实例变量

    class MyTest: myname = 'peter' # add a instance attribute    def __init__(self, name):        self.n ...

  8. 【类不类二】Python的类变量与实例变量

    在研究类的时候,难免会有很多疑问,C论坛和博客园高手如云(不知道是不是也美女如云), 搜到了这篇博文,是介绍Python的类变量和实例变量的 ! 刚好在下对self.***这种形式的实例变 量不是很理 ...

  9. Java中的类变量、实例变量、类方法、实例方法的区别

    类变量:形如static int a; 顾名思义,类变量可以理解为类的变量,类变量在类加载的时候就已经给它分配了内存空间,不同于实例变量(int a; ),实例变量是在该类创建对象的时候分配内存的.并 ...

随机推荐

  1. 如何使用ABBYY FineReader 12将JPEG文件转换成Word文档

    日常工作中处理JPEG格式的图像文件时,有时需要转换成Word文档进行编辑,市场上应用而生了很多转换工具,相信不少人听说过OCR(光学字符识别)软件,可以用来转换图像文件,而在OCR软件中, ABBY ...

  2. python -u 启动python文件的作用,PYTHONUNBUFFERED环境变量的作用

    python -u 启动python文件的作用是不缓存,直接把输出重定向到文件,比如nohup启动什么的,如果不使用-u启动,那么程序中的print和日志什么的,可能不会非常及时的重定向到out文件, ...

  3. MangoDB学习笔记

    01. 数据库操作 1. 查看当前数据库名称 db 2. 查看所有数据库名称,列出所有在物理上存在的数据库 show dbs; 3. 切换数据库,如果数据库不存在也并不创建,直到插入数据或创建集合时数 ...

  4. 在浏览器中高效使用JavaScript module(模块)

    在浏览器中也可以使用JavaScript modules(模块功能)了.目前支持这一特性的浏览器包括: Safari 10.1. 谷歌浏览器(Canary 60) – 需要在chrome:flags里 ...

  5. WinForm资源管理器开发(TreeView&ListView)

    在C# WinForm开发当中,有三大View控件值得深入应用,分别为DataGridView.ListView.TreeView.如果这三大控件能够熟练的应用,其它的控件也就基本没有问题.所以这篇博 ...

  6. Thrift版本管理

    对于健壮的服务,其中的数据类型必须一种机制来对其进行版本管理,尤其是它可以在不中断服务(或者更坏的情况,出现段错误)的前提下,增加或删除一个对象中的字段,或者改变一个函数的参数列表. 字段标识符 Th ...

  7. svn checkout 指定目录(转)

    http://www.uqugu.com/blog/article/svn-checkout-specified-forder/ svn有时只想检出指定目录,对于其他的大文件目录则不想检出,如不想检出 ...

  8. PAT甲级1055 The World's Richest【排序】

    题目:https://pintia.cn/problem-sets/994805342720868352/problems/994805421066272768 题意: 给定n个人的名字,年龄和身价. ...

  9. Javascript:一些基本语法

    便于日后复习快速回忆起来,把Javascript一些没那么普遍的语法特性写一写. Javascript作为三剑客的灵魂,我把它写在body里 <!DOCTYPE html> <htm ...

  10. An optimizer that trains as fast as Adam and as good as SGD. https://www.luolc.com/publications/ad…

    设立3个指针pa.pb和pc,其中pa和pb分别指向La表和Lb表中当前待比较插入的结点,而pc指向Lc表中当前最后一个结点:若pa->data<=pb->data,则将pa所指结点 ...