python的类属性问题

在python的类中,如果在类定义的时候,直接在类中定义属性(而不是在类的各种方法中)并赋值定义的,就是类属性。类属性为每一个实例都有的属性,而且对类属性的更改也会改变所有实例的该属性。

实际上,把类看作一个函数,类属性就是该函数中的函数内全局变量。

class Person(object):
    address = 'Earth'
    def __init__(self, name):
        self.name = name
该类所生成的任何实例,address属性都是earth

因为类属性是直接绑定在类上的,所以,访问类属性不需要创建实例,就可以直接访问:

print Person.address
# => Earth

对一个实例调用类的属性也是可以访问的,所有实例都可以访问到它所属的类的属性:

p1 = Person('Bob')
p2 = Person('Alice')
print p1.address
# => Earth
print p2.address
# => Earth

由于Python是动态语言,类属性也是可以动态添加和修改的:

Person.address = 'China'
print p1.address
# => 'China'
print p2.address
# => 'China'

因为类属性只有一份,所以,当Person类的address改变时,所有实例访问到的类属性都改变了。


然而,经测试,

class Game(object):
    type='football'
    def __init__(self,**kw):
        for i,k in kw.iteritems():
            setattr(self,i,k)


g1=Game(name='baca',level=1)
g2=Game(name='real marid',level=1)
g3=Game(name='real marid',level=1,type='table ball')
g1.type='basketball'
print g1.type
print g2.type
print g3.type
print Game.type


Game.type='no ball'
print 'after change game.type:'
print g1.type
print g2.type
print g3.type
print Game.type


显示结果为:

basketball
football
table ball
football
after change game.type:
basketball
no ball
table ball
no ball

所以,当实例对象引用该类的类属性时,如果该实例对象没有重新被绑定该属性,则引用的是类的属性(会随着类属性的变动而变动),而当该实例对象重新被定义了同名的属性的时候,即成为了该实例自己的属性,不随类属性的变动而变动。

当访问 实例对象的属性 ,优先查找实例属性,若没有实例属性,则查找类属性,若还是没有,则提示属性不存在。

可见,当实例属性和类属性重名时,实例属性优先级高,它将屏蔽掉对类属性的访问。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值