Python中的类属性与实例属性区别详解

 更新时间:2023年08月16日 10:08:30   作者:人气小姜  
这篇文章主要介绍了Python中的类属性与实例属性区别详解,类属性是在类中定义的属性,它是和这个类所绑定的,这个类中的所有对象都可以访问,实例属性是与类的实例相关联的数据值,是这个实例私有的,需要的朋友可以参考下

类属性与实例属性

首先我们简要说下类属性与实例属性在概念上的不同之处:

类属性是在类中定义的属性,它是和这个类所绑定的,这个类中的所有对象都可以访问。

访问时可以通过类名来访问,也可以通过实例名来访问。

实例属性是与类的实例相关联的数据值,是这个实例私有的,只有这个对象自己可以访问。

当一个实例被释放后,它的属性同时也被清除了。

然后我们通过一个具体的例子,来看下在访问类属性和实例属性时,Python是怎么进行操作的。

# 定义了类之后,Python就会为类分配一块内存空间,里面放它的相关属性和方法。
# 这里在类中定一个了一个类属性,相当于在Person类的内存空间中有了值为10的age属性。
class Person():
    age = 10
# 给类名加上函数调用符号,就相当于创建了一个对象。
# 现在我们分别创建了一个叫沈腾的人和一个叫马丽的人。
# 创建后,Python也会为对象分别分配内存空间
st = Person()  
ml = Person()
# 使用对象访问类属性,它会先去对象的内存空间里面找age属性,如果没有,就向上找对象所属类的内存空间。
# 而在这里它并不是直接取了对象的内存空间的age属性,因为此时对象的内存空间里面还没有age属性。
# 这里实际上是对象访问了类的内存空间,从类内存空间中取出来age属性的值,并打印出来
# 所以这里沈腾对象属性值和马丽对象属性值都是类属性值10
print("st对象:%s" % st.age)  
print("ml对象:%s" % ml.age)
 # 要记住一点,只要给对象有了赋值操作,那么就相当于给对象的内存空间中动态创建了一个属性,所以这里此时沈腾对象的内存空间中有了一个age属性了,是属于这个对象的属性,也就是我们所说的实例属性。
 # 那么此时st.age会先在对象内存空间中找age属性,找到了,就不会再去类内存空间中找,所以此时st.age访问的是对象内存空间的age属性。
 # 所以此时沈腾对象属性值是沈腾对象内存空间age属性的值,也就是12。而非类属性值10。
st.age = 12 
print("st对象:%s" % st.age)
# 因为马丽对象还没有进行赋值操作,所以它还没有在它自己的内存空间中动态创建age属性。所以它这里访问的依旧是类内存空间中的age属性值。
# 而上述语句改变的是沈腾内存空间中age的值,所以不会影响到马丽对象属性值。
# 这里打印马丽对象属性值也就是类的属性值10。
print("ml对象:%s" % ml.age) 
# 因为上面的赋值语句改变的是对象的内存空间,所以类属性的值其实并没有改变,依旧是原来的值10。
print("类属性值:%s" % Person.age)  

我们看下具体的打印结果和我们分析的是否一致

可以看到,在没有st.age没有执行之前的打印值都是类属性的值10,而st.age=12执行后,st.age值就变成了12,而ml.age和Person.age都没有变,依旧是类属性的10。

在这里插入图片描述

我们再通过图解的形式理解下:

在这里插入图片描述

在这里插入图片描述

还有一点需要说明,我们可以在类的构造方法__init__中对对象的属性进行初始化,这里也是相当于对对象的属性进行了赋值操作,所以也是在对象的内存空间中动态的创建了实例属性。

因为self参数就相当于对象自己,self.age在对象创建后就相当于对象.age,如st.age,ml.age,和上面例子原理是一样的。

class Person():
    age = 10
    def __init__(self, age):
        self.age = age
# 因为在构造方法中就已经给self.age属性赋值了。
# 所以创建对象时,沈腾对象内存空间中和马丽对象内存空间中就都有了age属性,这是属于对象的属性。
# 所以以后在使用st.age和ml.age时,访问到的都是对象内存空间中的age值了。
st = Person(18)  
ml = Person(9)
# 这里就访问的是对象内存空间中的age属性值了
# 所以分别打印18和9
print("st对象:%s" % st.age)  
print("ml对象:%s" % ml.age)
# 这里给沈腾对象的age属性重新赋值,改变的也仅是沈腾对象内存空间中的age属性值
# 不会改变马丽对象内存空间age属性值和类内存空间age属性值。
st.age = 12  
print("st对象:%s" % st.age)
print("ml对象:%s" % ml.age) 
print("类属性值:%s" % Person.age)  

我们来看下打印结果:

在这里插入图片描述

这个也来个图解吧

在这里插入图片描述

总结下:

  1. 类属性在类创建时就存在于类的内存空间中。
  2. 如果类的构造函数中没有初始化对象属性,那么对象在创建时内存空间是没有这个属性的。
  3. 实例属性是通过赋值语句来动态创建的。如果没有动态创建,通过对象访问和类同名的属性时,会现在对象内存空间中查找是否有该属性,没有就去类内存空间中查找。
  4. 如果已经动态创建了实例属性,那么Python使用对象访问和类同名的属性时,是一定先访问对象内存空间中的实例属性的。

到此这篇关于Python中的类属性与实例属性区别详解的文章就介绍到这了,更多相关Python类属性与实例属性内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python自动计算图像数据集的RGB均值

    python自动计算图像数据集的RGB均值

    这篇文章主要为大家详细介绍了python自动计算图像数据集的RGB均值,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-06-06
  • pytorch实现手写数字图片识别

    pytorch实现手写数字图片识别

    这篇文章主要为大家详细介绍了pytorch实现手写数字图片识别,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-05-05
  • Matplotlib之解决plt.savefig()保存多张图片有重叠的问题

    Matplotlib之解决plt.savefig()保存多张图片有重叠的问题

    这篇文章主要介绍了Matplotlib之解决plt.savefig()保存多张图片有重叠的问题,具有很好的参考价值,希望对大家有所帮助,
    2023-09-09
  • python中class的定义及使用教程

    python中class的定义及使用教程

    这篇文章主要介绍了python中class的定义及使用,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-09-09
  • 深入理解Python装饰器

    深入理解Python装饰器

    装饰器(decorator)是一种高级Python语法。装饰器可以对一个函数、方法或者类进行加工。这篇文章主要介绍了深入理解Python装饰器的相关资料,需要的朋友可以参考下
    2016-07-07
  • Python实现读取邮箱中的邮件功能示例【含文本及附件】

    Python实现读取邮箱中的邮件功能示例【含文本及附件】

    这篇文章主要介绍了Python实现读取邮箱中的邮件功能,可读取邮件文本及附件的功能,涉及Python针对邮件的获取、分析、保存等相关操作技巧,需要的朋友可以参考下
    2017-08-08
  • 如何利用opencv训练自己的模型实现特定物体的识别

    如何利用opencv训练自己的模型实现特定物体的识别

    在Python中通过OpenCV自己训练分类器进行特定物体实时识别,下面这篇文章主要给大家介绍了关于如何利用opencv训练自己的模型实现特定物体的识别,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-10-10
  • 在Python中使用正则表达式的方法

    在Python中使用正则表达式的方法

    这篇文章主要介绍了在Python中使用正则表达式的方法,讲到了专门对正则表达式提供支持的扩展库re,需要的朋友可以参考下
    2015-08-08
  • Python 自动控制原理 control的详细解说

    Python 自动控制原理 control的详细解说

    这篇文章主要介绍了Python自动控制原理control的详细解说,文章围绕主题展开对Python control的介绍,具有一定的参考价值,需要的朋友可以参考一下
    2022-07-07
  • django的auth认证,authenticate和装饰器功能详解

    django的auth认证,authenticate和装饰器功能详解

    这篇文章主要介绍了django的auth认证,authenticate和装饰器功能详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07

最新评论