Python的类实例属性访问规则

一般来说,在python中,类实例属性的访问规则算是比较直观的。

但是,仍然存在一些不是很直观的地方,特别是对C++和Java程序员来说,更是如此。

在这里,我们需要明白以下几个地方:

1.Python是一门动态语言,任何实体都可以动态地添加或删除属性。

2.一个类定义了一个作用域。

立即学习“Python免费学习笔记(深入)”;

3.类实例也引入了一个作用域,这与相应类定义的作用域不同。

4.在类实例中查找属性的时候,首先在实例自己的作用域中查找,如果没有找到,则再在类定义的作用域中查找。

5.在对类实例属性进行赋值的时候,实际上会在类实例定义的作用域中添加一个属性(如果还不存在的话),并不会影响到相应类中定义的同名属性。

下面看一个例子,加深对上述几点的理解:

class A:

cls_i = 0

cls_j = {}

def __init__(self):

self.instance_i = 0

self.instance_j = {}

在这里,我们先定义类A的一个实例a,然后再看看类A的作用域和实例a的作用域中分别有什么:

>>> a = A()

>>> a.__dict__

{‘instance_j’: {}, ‘instance_i’: 0}

>>> A.__dict__

{‘__init__’: , ‘__module__’: ‘__main__’, ‘cls_i’: 0, ‘cls_j’: {}, ‘__doc__’: None}

我们看到,a的作用域中有instance_i和instance_j,A的作用域中有cls_i和cls_j。

我们再来看看名字查找是如何发生的:

>>> a.cls_i

0

>>> a.instance_i

0

在查找cls_i的时候,实例a的作用域中是没有它的,却在A的作用域中找到了它;在查找instance_i的时候,直接可在a的作用域中找到它。

如果我们企图通过实例a来修改cls_i的值,那会怎样呢:

>>> a.cls_i = 1

>>> a.__dict__

{‘instance_j’: {}, ‘cls_i’: 1, ‘instance_i’: 0}

>>> A.__dict__

{‘__init__’: , ‘__module__’: ‘__main__’, ‘cls_i’: 0, ‘cls_j’: {}, ‘__doc__’: None}

我们可以看到,a的作用域中多了一个cls_i属性,其值为1;同时,我们也注意到A作用域中的cls_i属性的值仍然为0;在这里,我们其实是增加了一个实例属性,并没有修改到类属性。

如果我们通过实例a操纵cls_j中的数据(注意不是cls_j本身),又会怎么样呢:

>>> a.cls_j[‘a’] = ‘a’

>>> a.__dict__

{‘instance_j’: {}, ‘cls_i’: 1, ‘instance_i’: 0}

>>> A.__dict__

{‘__init__’: , ‘__module__’: ‘__main__’, ‘cls_i’: 0, ‘cls_j’: {‘a’: ‘a’}, ‘__doc__’: None}

我们可以看到a的作用域没有发生什么变化,但是A的作用域发生了一些变化,cls_j中的数据发生了变化。

实例的作用域发生变化,并不会影响到该类的其它实例,但是类的作用域发生变化,则会影响到该类的所有实例,包括在这之前创建的实例:

>>> A.cls_k = 0

>>> i.cls_k

0

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2283647.html

(0)
上一篇 2025年2月27日 20:17:19
下一篇 2025年2月18日 11:25:02

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • python encode和decode的妙用

    字符串解码: 有个字符串: ‘\u4fee\u6539\u8282\u70b9\u72b6\u6001\u6210\u529f’ 想转换为: u”u4feeu6539u8282u70b9u72b6u600…

    编程技术 2025年2月27日
    200
  • Python实用技巧总结

    以下是我近些年收集的一些python实用技巧和工具,希望能对你有所帮助。 交换变量 x = 6 y = 5 x, y = y, x 立即学习“Python免费学习笔记(深入)”; print x >>> 5 print y…

    编程技术 2025年2月27日
    200
  • Python yield 使用浅析

    您可能听说过,带有 yield 的函数在 python 中被称之为 generator(生成器),何谓 generator ?   我们先抛开 generator,以一个常见的编程题目来展示 yield 的概念。   如何生成斐波那契數列 …

    编程技术 2025年2月27日
    200
  • 利用Python的SocketServer框架编写网络服务程序

    1.前言: 虽说用Python编写简单的网络程序很方便,但复杂一点的网络程序还是用现成的框架比较好。这样就可以专心事务逻辑,而不是套接字的各种细节。SocketServer模块简化了编写网络服务程序的任务。同时SocketServer模块也…

    编程技术 2025年2月27日
    200
  • python数据类型转换

    python类型转换 函数                      描述   int(x [,base ])         将x转换为一个整数   long(x [,base ])        将x转换为一个长整数   float(x…

    编程技术 2025年2月27日
    200
  • Python的字符串索引和分片

    1.字符串的索引 给出一个字符串,可输出任意一个字符,如果索引为负数,就是相当于从后向前数。 >>> str=”HelloWorld!” >>> print str[0] H 立即…

    编程技术 2025年2月27日
    200
  • python None与Null 的区别

    一、python对象 要理解这个,首先要理解Python对象: python对象具有三个特性:身份、类型、值。 三特性在对象创建时被赋值。只有值可以改变,其他只读。 类型本身也是对象。 立即学习“Python免费学习笔记(深入)”; 二、N…

    编程技术 2025年2月27日
    200
  • Python2和Python3的10大区别

    1.性能 Py3.0运行pystone benchmark的速度比Py2.5慢30%。Guido认为Py3.0有极大的优化空间,在字符串和整形操作上可以取得很好的优化结果。 2.编码 Py3.0源码文件默认使用utf-8编码,这就使得以下代…

    编程技术 2025年2月27日
    200
  • python全局变量

    全局变量不符合参数传递的精神,所以,平时我很少使用,除非定义常量。今天有同事问一个关于全局变量的问题,才发现其中原来还有门道。 程序大致是这样的: CONSTANT = 0def modifyConstant() :        prin…

    编程技术 2025年2月27日
    200
  • python 图 自身遍历及弱引用使用

    在【python 标准库】中看到的一段代码,非常有帮助: def all_nodes(self):        yield self        n = self.other        while n and n.name != s…

    编程技术 2025年2月27日
    200

发表回复

登录后才能评论