python 的 类属性 与 实例属性
2014-04-14 23:16
274 查看
python中类属性与其被定义的类绑定,和任何实例都无关。
对于类属性的访问,可以通过 类名+“.” + 属性名的方式来访问(如以下示例的Person.age);也可以通过类的实例+“.” + 属性名的方式(如以下示例最初使用的p.age),但此时需要有一定要求,那就是,该实例没有与类变量同名的变量,因为如果实例含有与类属性同名的属性,则用该实例访问属性时,访问的是实例中的属性。
而对类属性的值的修改,只能通过类名的访问加以实现。(此处存在一点例外,最后会加以说明)
以下通过一段实例代码加以说明:
>>> class Person():
age =10
>>> p = Person()
>>> print Person.age , p.age
10 10
>>> Person.age +=1
>>> print Person.age , p.age
11 11
>>> p.age += 1
>>> print Person.age , p.age
11 12
在以上的操作中,定义了Person类和age的类属性,对于实例p,当它不存在同名的实例变量age的时候,Person.age和p.age均可访问类变量;
然而,当p.age += 1 之后,就意味着p这个实例具有了一个属性age,恰恰与Person类的属性age同名。这样,p.age则访问的是p的实例属性,而非Person类的属性。
进一步的,我们可以通过调用.__dict__,看一看。
>>> print Person.__dict__ ,p.__dict__
{'__module__': '__main__', 'age': 11, '__doc__': None} {'age': 12}
那么实例对象的影响会持续到什么时候?事实上,只要实例对象被del掉,还是可以通过p.age来访问类变量的。
>>> del p.age
>>> print Person.age , p.age
11 11
>>> print Person.__dict__ ,p.__dict__
{'__module__': '__main__', 'age': 11, '__doc__': None} {}
以上说到:而对类属性的值的修改,只能通过类名的访问加以实现,此处存在特殊情况。而特殊情况就是:当类属性是一个可变对象(如字典,序列)时,就可以通过实例来对其加以修改。
>>> class Person():
age = {'zhousui':10}
num = [1,2,3,4]
>>> p = Person()
>>> print Person.age['zhousui'] , p.age['zhousui']
10 10
>>> print Person.num[0] , p.num[0]
1 1
>>> Person.num[0] = 10
>>> print Person.num[0] , p.num[0]
10 10
>>> p.num[0] = 20
>>> print Person.num[0] , p.num[0]
20 20
>>> print Person.num
[20, 2, 3, 4]
以上。
对于类属性的访问,可以通过 类名+“.” + 属性名的方式来访问(如以下示例的Person.age);也可以通过类的实例+“.” + 属性名的方式(如以下示例最初使用的p.age),但此时需要有一定要求,那就是,该实例没有与类变量同名的变量,因为如果实例含有与类属性同名的属性,则用该实例访问属性时,访问的是实例中的属性。
而对类属性的值的修改,只能通过类名的访问加以实现。(此处存在一点例外,最后会加以说明)
以下通过一段实例代码加以说明:
>>> class Person():
age =10
>>> p = Person()
>>> print Person.age , p.age
10 10
>>> Person.age +=1
>>> print Person.age , p.age
11 11
>>> p.age += 1
>>> print Person.age , p.age
11 12
在以上的操作中,定义了Person类和age的类属性,对于实例p,当它不存在同名的实例变量age的时候,Person.age和p.age均可访问类变量;
然而,当p.age += 1 之后,就意味着p这个实例具有了一个属性age,恰恰与Person类的属性age同名。这样,p.age则访问的是p的实例属性,而非Person类的属性。
进一步的,我们可以通过调用.__dict__,看一看。
>>> print Person.__dict__ ,p.__dict__
{'__module__': '__main__', 'age': 11, '__doc__': None} {'age': 12}
那么实例对象的影响会持续到什么时候?事实上,只要实例对象被del掉,还是可以通过p.age来访问类变量的。
>>> del p.age
>>> print Person.age , p.age
11 11
>>> print Person.__dict__ ,p.__dict__
{'__module__': '__main__', 'age': 11, '__doc__': None} {}
以上说到:而对类属性的值的修改,只能通过类名的访问加以实现,此处存在特殊情况。而特殊情况就是:当类属性是一个可变对象(如字典,序列)时,就可以通过实例来对其加以修改。
>>> class Person():
age = {'zhousui':10}
num = [1,2,3,4]
>>> p = Person()
>>> print Person.age['zhousui'] , p.age['zhousui']
10 10
>>> print Person.num[0] , p.num[0]
1 1
>>> Person.num[0] = 10
>>> print Person.num[0] , p.num[0]
10 10
>>> p.num[0] = 20
>>> print Person.num[0] , p.num[0]
20 20
>>> print Person.num
[20, 2, 3, 4]
以上。
相关文章推荐
- Python 进阶_OOP 面向对象编程_实例属性和方法
- Python 实例属性VS类属性1
- python的类属性和实例属性
- Python Class的实例属性/类属性
- Python——类属性/实例属性
- python之类属性和实例对象属性
- python基础-面向对像、类名\实例调用、__init__函数、类名\实例增删改查属性
- python中创建实例属性
- Python语法中容易混淆的地方-类属性/实例属性/公有变量/私有化变量
- Python的类实例属性访问规则探讨
- python_类属性和实例属性
- 简单理解Python中的类对象、实例对象、属性、方法
- Python实例属性限制(__slots__)
- Python拾遗之类属性和实例属性(二)
- python的类变量与实例变量以及__dict__属性
- python中的类属性与实例属性
- python中的类属性和实例属性
- python中类属性和类实例的属性的区别
- python进阶学习笔记(四)——python中访问限制、创建类属性、定义实例方法、定义类方法、类的继承
- python的类属性和实例属性