python进阶13:创建类属性

1 创建类属性

  绑定在一个实例上的属性不会影响其他实例,但是,类本身也是一个对象,如果在类上绑定一个属性,则所有实

例都可以访问类的属性,并且,所有实例访问的类属性都是同一个!也就是说,实例属性每个实例各自拥有,互相独

立,而类属性有且只有一份。定义类属性可以直接在 class 中定义:

class Person(object):
    address = 'Earth'
    def __init__(self, name):
        self.name = name
  因为类属性是直接绑定在类上的,所以,访问类属性不需要创建实例,就可以直接访问。对一个实例调用类的属

性也是可以访问的,所有实例都可以访问到它所属的类的属性:

>>> 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改变时,所有实例访问到的类属性都改变了。
2 类属性和实例属性冲突

  先来看例子:

class Person(object):
    address = 'Earth'
    def __init__(self, name):
        self.name = name

p1 = Person('Bob')
p2 = Person('Alice')
  创建完后开始实验:

>>> print Person.address
Earth
>>> p1.address = 'China'
>>> print p1.address
China
>>> print Person.address
Earth
>>> print p2.address
Earth
  p1.address = 'China'并没有改变 Person 的 address,而是给 p1这个实例绑定了实例属性address ,对p1来

说,它有一个实例属性address(值是'China'),而它所属的类Person也有一个类属性address,所以:访问

 p1.address 时,优先查找实例属性,返回'China'。访问 p2.address 时,p2没有实例属性address,但是有类属

性address,因此返回'Earth'。可见,当实例属性和类属性重名时,实例属性优先级高,它将屏蔽掉对类属性的访

问。
  当我们把 p1 的 address 实例属性删除后,访问 p1.address 就又返回类属性的值 'Earth'了:

>>> del p1.address
>>> print p1.address
Earth





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值