Python 类变量及实例变量

类变量

  1. 不可变变量作为类变量:对于INT,STRING这种不可变变量,如果将其作为类变量,则是传值。即所有对象的类变量有各自的内存地址。
  2. 可变变量作为类变量:对于列表、字典、自定义类这些可变变量,如果将其作为类变量,则是传引用。即所有对象的类变量公用一个内存地址。

实例变量

  1. 不管是可变变量还是不可变变量,只要是放在构造函数中,则都是传值。即各个对象拥有自己的对象属性。

示例代码及说明

class Demo(object):
    a = 1
    list_var = []

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

    def show_variable(self):
        print("I'm %s, I'm %s years old" % (self.name, self.age))

    def add(self):
        print(self.a)
        self.a += 1
        print(self.a )

    def add_list(self):
        self.list_var.append(1)
        print(self.list_var)
        
    demo1 = Demo('jack', 18)
    demo2 = Demo('tom', 22)
    # 类的对象也可以访问类变量 a = 1
    print(demo1.a)
    # 当类对象demo1试图修改类的immutable类变量a时,python的处理是 在内存中为对象demo1新建一个实例变量a,此时对象demo1就具有了自己的实例变量a
    demo1.a = 10
    # 此时输出的就是对象demo1自己的实例变量a, a = 10
    print(demo1.a)
    # 类变量实际上没有被修改, 所以输出 a = 1
    print(Demo.a)
    # 由于类对象demo2没有实例变量a,所以输出的还是类变量 a = 1
    print(demo2.a)
    
    # 当类的对象demo1试图修改mutable的类变量list_var时,python的处理是  找到类Demo中的变量list_var, 直接进行修改,不会给类对象demo1新生成一个变量。
    # 类 Demo 和 Demo的所有对象公用这个list_var
    demo1.list_var.append(1)
    print(demo1.list_var)   # [1]
    print(Demo.list_var)    # [1]
    print(demo2.list_var)   # [1]复制代码

转载于:https://juejin.im/post/5c2ecc0ce51d45522578b297

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

表情包
插入表情
评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值