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

如题所述

一般来说,在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.Python是一门动态语言,任何实体都可以动态地添加或删除属性。2.一个类定义了一个作用域。3.类实例也引入了一个作用域,这与相应类定义的作用域不同。4.在类实例中查找属性的时候,首先在实例自己的作用域中查找,如果没有找到,则再在类定义的作用域中查找。5.在对类实例属性进行赋值的时候,实...

透彻理解class(2):类、实例、属性、对象、方法
类属性属于类的成员,所有实例共享这些属性。例如,一个表示“动物”类可能有一个类属性“生命状态”,用于表示所有动物都具有的生命特征。而实例属性是特定于每个实例的属性,它们在创建实例时由用户定义。例如,一个“猫”实例可能会有自己的“颜色”属性。类方法是与类关联的方法,通常用于执行与类相关...

Python入门 类class 基础篇
实例属性与类属性的区分:实例属性用于区分不同实例,共有的类属性属于全类所共享。实例创建时,定义的特定方法(如初始化方法`__init__`),能自动赋予实例特定属性。初始化方法的用法类似Java中的构造函数,用于在实例创建时初始化属性。定义类`Circle`时加入特定属性,如半径,以实现实例化后的自定义...

实例方法和类方法的区别 python
有区别的,最主要的区别在于,定义类方法主要是要加一个装饰器,@classmethod 而实例方法没有这个装饰器。这是区别实例方法和类方法的最主要的区别。在调用上的区别在于,实例方法要先实例化一个对象再调用这个实例化方法,而类方法不需要有类的实例,直接类名.方法名就可以调用。实例方法至少有一个参数...

Python入门 类class 基础篇
Python中,类扮演着模板的角色,而实例则是根据这个模板创建的具体对象。类是一种抽象概念,用于汇集相似对象的特征,例如,我们可以抽象出一个圆类,它共享圆周率π和半径r这两个特征。每个圆实例可能有不同的半径,而π作为共性,是类属性。通过类,我们可以计算圆的面积和周长等。在Python中,我们使用...

24.Python编程:类中特殊的__slots__变量
在Python编程中,了解类属性和实例属性的区分至关重要。类属性属于整个类所有,而实例属性则属于各个实例对象所有,且互不干扰。以Car类为例,其内部设计仅允许对特定实例绑定特定属性,如speed和color。然而,有时我们可能希望限制实例的属性,仅允许添加特定的属性,如speed和color。为实现这一目标,我们...

python什么是类,对象,实例
类的属性 就是 类变量 实例变量:定义在方法中的变量,只作用于当前实例的类。例子:class Turtle:#python 中类名约定以大写字母开头 '''关于类的简单例子。。。'''属性 == 类变量 color ="green"weight="10kg"legs=4 shell=True mouth='big&#...

阿里二面:Python中类方法、实例方法、静态方法三者的区别
Python 中类方法就是针对类对象定义的方法,在类方法的内部可以直接访问类属性或者调用其它类方法。特点:采用@classmethod 装饰器,至少传入一个cls(代指类本身,类似self)参数。执行类方法时,自动将调用该方法的类赋值给cls。类方法有两种调用方式:1. 使用类名调用 2. 使用实例名调用 一般建议使用...

python 类的定义和属性
类属性指的是在类中定义的属性,这些属性对所有实例共享,意味着所有实例都具有相同的属性值。类的实例是具体的对象,它们基于类创建。所有实例共享类属性的值。这些实例具有特定的属性,使其与类中的其他实例区分开来。在Python中,实例化类的新实例时,会自动调用 _init_() 构造方法。这是初始化实例...

python中类方法,实例方法,静态方法的作用和区别
在Python中,类方法、实例方法和静态方法各有其独特的作用和调用规则。实例方法,作为类的实例能够直接使用的,其首参通常为“self”,代表实例对象,可用于操作实例的属性和方法。它们只能由实例对象调用。类方法则是通过@classmethod装饰器定义的,首参为“cls”,代表当前类对象,主要用于对类进行操作,...

相似回答
大家正在搜