python实例属性的赋值_Python 类属性与实例属性的关联

类属性是属于一个类的变量,就像是C++中类的静态成员变量,你只需将该属性定义在所有方法的作用域外,即为类属性,但一般是紧跟在类名后面,类属性为所有实例所共有,你可以通过 类名.属性 来调用类属性

>>> class A:

count = 0; #这就是类属性

def __init__(self):

A.count += 1 #每次调用该方法 count 自增 1

def output(self):

print(self.count)

>>> a1 = A()

>>> a1.output()

1

>>> A.count = 0

>>> A.count

0

>>> a1.output() (为什么会是0,后面会详细说明)

0

实例属性是属于实例自己的属性,你可以在任何方法中添加新的实例属性,甚至在类外添加,Python会在实例属性初次使用时,创建该属性并赋值

>>> class A:

def __init__(self):

self.num = 1 #添加实例属性num

def again(self,name):

self.name = name #添加实例属性name

>>> a1 = A()

>>> a1.num

1

>>> a1.name #这时实例 a1 中还没有实例属性 name

Traceback (most recent call last):

File "", line 1, in

a1.name #这时实例 a1 中还没有实例属性 name

AttributeError: 'A' object has no attribute 'name'

>>> a1.again('Jane')

>>> a1.name #现在有了...

'Jane'

>>> a1.call = '123456' #添加a1的实例属性 call

>>> a1.call

'123456'

继续看下面的例子:

[python] view plaincopy

>>> class A:

count = 0

def __init__(self):

A.count += 1

def output(self):

print(self.count)

>>> a1 = A()

>>> a2 = A()

>>> a3 = A()

>>> A.count # A的类属性count这时为3

3

>>> A.count = 2 #更改A的类属性为2

>>> a1.count,a2.count, a3.count, A.count #A的所有实例的count也同样改变

(2, 2, 2, 2)

>>> a1.count = 5 #通过A的一个实例a1更改count

>>> a1.count, a2.count, a3.count, A.count #只有a1的count发生改变

(5, 2, 2, 2)

>>> A.count = 4 #再次更改A的类属性为4

>>> a1.count, a2.count, a3.count, A.count #这时a1的count还是保持为5

(5, 4, 4, 4)

解释为什么会是0?

先看代码:

class base:

count = 0

def __init__(self):

base.count += 1

def output(self):

print(self.count)

a1 = base()

a2 = base()

a3 = base()

print(base.count) # 3

a1.output() # 3 这里实例属性与类仍然还是共同引用一个count对象

base.count += 4

a1.output() # 3+4

print(base.count) # 3

print(a1.count) # 3 同理,共同引用一个count对象

base.count = 0 当改变类属性count时,实例属性count也跟着会变化

print(a1.count) # 0

class base:

count = 0

def __init__(self):

base.count += 1

def output(self):

print(self.count)

a1 = base()

a2 = base()

a3 = base()

print(base.count) # 3

a1.count = 9 这个实例属性从类属性中分离出去

base.count += 4 因此类属性count的改变不会影响到实例属性count

print(base.count) # 7

print(a1.count) # 9

print(base.count) # 3

a1.count = 9

base.count += 4

print(base.count) # 7

a1.output() # 9

通过上面的例子我们可以看到,类属性为所有实例和类所共有,通过 类名.类属性 可以更改类属性,并且所有实例的类属性也随之改变,但通过 实例名.类属性 来改变类属性,该实例的该类属性会变为实例属性,而不影响其他实例的类属性,以后通过 类名.类属性 来更改类属性,也不会影响到该实例的这个属性了,因为它变为实例属性啦。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值