百科狗-知识改变命运!
--

谈谈python中类属性和类实例的属性的区别

泡在奶味里1年前 (2023-12-22)阅读数 5#综合百科
文章标签实例作用

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

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

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

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

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

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

你可以这样理解:类变量相当于一个人的姓,是先于对象存在的;而实例变量是对象创建之后再存在的,相当于人的名字;

谈谈python中类属性和类实例的属性的区别

1、类变量也叫静态变量,也就是在变量前加了static 的变量;

2、实例变量也叫对象变量,即没加static 的变量;

3、区别在于:类变量和实例变量的区别在于:类变量是所有对象共有,其中一个对象将它值改变,其他对象得到的就是改变后的结果;而实例变量则属对象私有,某一个对象将其值改变,不影响其他对象;

鹏仔微信 15129739599 鹏仔QQ344225443 鹏仔前端 pjxi.com 共享博客 sharedbk.com

免责声明:我们致力于保护作者版权,注重分享,当前被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理!邮箱:344225443@qq.com)

图片声明:本站部分配图来自网络。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

内容声明:本文中引用的各种信息及资料(包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主体(包括但不限于公司、媒体、协会等机构)的官方网站或公开发表的信息。部分内容参考包括:(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供参考使用,不准确地方联系删除处理!本站为非盈利性质站点,本着为中国教育事业出一份力,发布内容不收取任何费用也不接任何广告!)