第13章 面向对象编程(5)

13.6 实例属性

实例仅拥有数据属性(方法严格来说是类属性),后者只是与某个类的实例相关联的数据值,并且可以通过句点属性标识法来访问。这些值独立于其他实例或类。当一个实例被释放后,它的属性同时也被清楚了。

13.6.1 ”实例化“实例属性(或创建一个更好的构造器)

1. 在构造器中首先设置实例属性

构造器是最早可以设置实例属性的地方,因为__init__()是实例创建后第一个被调用的方法。

2. 默认参数提供默认的实例安装

默认参数应当是不变的对象;像列表(list)和字典(dictionary)这样的可变对象可以扮演静态数据,然后在每个地方调用中来维护它们的内容。

3. __init__()应当返回None

>>> class C(object): ... def __init__(self, par1 = 1, par2 = "2"): ... self.att1 = par1 ... self.att2 = par2 ... return None ... >>> C().__dict__ {'att2': '2', 'att1': 1} >>> c = C() >>> (c.__class__)().__dict__ {'att2': '2', 'att1': 1} >>>
13.6.2 查看实例属性

与类相似,实例也有一个__dict__特殊属性,它是实例属性构成的一个字典。

13.6.3 特殊的实例属性

c.__class__ 实例化c的类

c.__dict__ c的属性

13.6.4 内建类型属性

对内建类型也可以使用dir(),与任何其他对象一样,可以得到一个包含它属性名字的列表。

试着访问__dict__会失败,因为在内建类型中,不存在这个属性。

13.6.5 实例属性vs类属性

1. 访问类属性

>>> class C(object): ... attr1 = 1.0 ... >>> C.attr1 1.0 >>> c=C() >>> c.attr1 1.0 >>> C.attr1=1.1 >>> c.attr1 1.1 >>> C.attr1 1.1 >>> 当实例c被创建后,对实例c而言,访问c.version会失败,不过Python首先会在实例中搜索名字version,然后是类,再就是继承树中的基类。

2. 从实例中访问类属性需谨慎

给一个与类属性同名的实例属性赋值,我们会有效地”隐藏“类属性,但一旦我们删除了这个实例属性,类属性又重见天日。

>>> class C(object): ... attr1 = 1 ... >>> c=C() >>> c.attr1 1 >>> c.attr1 = 2 >>> c.attr1 2 >>> C.attr1 1 >>> del c.attr1 >>> c.attr1 1 >>> C.attr1 1 >>> 但在类属性值可变的情况下,一切又都不同了:

>>> class C(object): ... attr1 = {"1":111} ... >>> C.attr1 {'1': 111} >>> c=C() >>> c.attr1["2"] = 222 >>> C.attr1 {'1': 111, '2': 222} >>> del c.attr1 Traceback (most recent call last): File "<interactive input>", line 1, in <module> AttributeError: attr1 >>> 3. 类属性持久性

类属性的修改会影响到所有的实例。

>>> class C(object): ... attr1 = 1 ... >>> C.attr1 1 >>> C.attr1 = 2 >>> c= C() >>> c.attr1 2 >>>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值