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

  

 

原文地址:https://www.cnblogs.com/zhengna/p/9598694.html

时间: 2024-11-08 12:22:22

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

Java中静态变量(类变量)、实例变量、局部变量和成员变量

导读 学习Java的过程中,一开始很容易被这些各种变量绕晕,这篇博客主要介绍了这几种变量之间的关系和区别. 例程 package com.cunyu.demo public class Demo { private String name; //成员变量.实例变量 private int age; //成员变量.实例变量 private int ID; //成员变量.实例变量 public static final String school = "卡塞尔学院"; //成员变量.静态变

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

Python类中的变量有类变量和实例变量之分. 类变量:变量绑定在类上,同一个类之间的共享变量,类比于Java中的静态变量static 公有变量定义 Java 的定义方式 class Test{ public static class_variable = "123" } Python3 定义方式 class Test: class_variable = "123" 私有变量定义 Java 的定义方式 class Test{ private static class

类变量和实例变量的区别

1.简介:       1.类变量也叫静态变量,也就是在变量前加了static 的变量:       2.实例变量也叫对象变量,即没加static 的变量: 区别在于:类变量和实例变量的区别在于:类变量是所有对象共有,其中一个对象将它值改变,其他对象得到的就是改变后的结果:而实例变量则属对象私有,某一个对象将其值改变,不影响其他对象: 例: 1 public class A{ 2 static int a = 0; //类变量 3 private int b = 0; //实力变量 4 } 5

python——实例方法、静态方法、类方法、类变量和实例变量浅析

概述: 实例方法就是类的实例能够使用的方法. 静态方法是一种普通函数,就位于类定义的命名空间中,它不会对任何实例类型进行操作.使用装饰器@staticmethod定义静态方法.类对象和实例都可调用静态方法. 类方法是将类本身作为对象进行操作的方法.类方法使用@classmethod装饰器定义,其第一个参数是类,约定写为cls.类对象和实例都可以调用类方法. super用来执行父类中的函数. 类变量定义在类的定义之后,实例变量则是以为self.开头. 如何调用父类的构造函数:子类(派生类)并不会自

怎么区分类变量和实例变量?

# -*- coding: utf-8 -*- #python 27 #xiaodeng #怎么区分类变量和实例变量? #实例变量:在变量前面添加了self,就是实例变量,比如:self.name(完整定义为:属于实例私有,对实例变量的操作不会影响到其他的实例对象) #类变量:不添加前缀self,就是类变量(完整定义为:被该类的所有实例可以共享的变量,如果某个实例修改了该变量,这个变量可以被其他实例看到) class Person() : count = 0 def __init__(self,

变量:类变量,实例变量

1. 分类 分为类变量(静态变量.全局变量).实例变量.局部变量.其中静态变量.实例变量的区别是是否被static修饰 2. 类变量与实例变量在内存和调用上的区别 (1)调用:类变量是用"类名.变量名"格式来调用,实例变量通过"对象名.变量名"格式来调用 (2)内存: 类变量在类加载的时候就被初始化,而实例变量在对象new 出来后初始化. 类变量单独划分一块内存区域,独立于该类的任何对象.也就是说,不依赖于特定的实例,被类的所有实例共享: 实例变量在对象new出来后

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

http://www.jb51.net/article/49402.htm 注:使用的是Python2.7. 一.实例方法 实例方法就是类的实例能够使用的方法.如下: 复制代码 代码如下: class Foo:    def __init__(self, name):        self.name = name    def hi(self):        print self.name if __name__ == '__main__':    foo01 = Foo('letian')

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

在研究类的时候,难免会有很多疑问,C论坛和博客园高手如云(不知道是不是也美女如云), 搜到了这篇博文,是介绍Python的类变量和实例变量的 ! 刚好在下对self.***这种形式的实例变 量不是很理解,就拿来与诸君共享! C博客的大伽: http://blog.csdn.net/xxkkff/article/details/4396895 上一篇[类不类2]: http://www.cnblogs.com/Ruby517/p/5709558.html 一般的类定义是写成这种形式 class <

【JAVA&#183;转】类变量和实例变量的区别

类变量和实例变量的区别 类变量也叫静态变量,也就是在变量前加了static 的变量:实例变量也叫对象变量,即没加static 的变量:区别在于:    类变量和实例变量的区别在于:类变量是所有对象共有,其中一个对象将它值改变,其他对象得到的就是改变后的结果:而实例变量则属对象私有,某一个对象将其值改变,不影响其他对象:例:public class A{    static  int a = 0; //类变量    private int b = 0; //实力变量} public class B