• 【Python基础篇018】类的进阶知识点


    📚前言

    ✅本次主要介绍的是类的进阶知识点,其中包括类的命名空间等等知识点,进一步了解并熟练使用类,了解类中对静态属性和对动态属性的修改有什么区别呢?

    文章目录

    📚前言

    🌄一、初识命名空间

    🌄二、__dict__方法

    🌄三、为实例化对象和类创建的内存空间

    🌄四、静态属性修改知识点

    🌌1、del的使用

    🌄五、动态属性修改知识点

    🌌1、小结

    📚结语

    🌄一、初识命名空间

    要了解类的命名空间首先我们先创建一个类,如下

    1. class Course:
    2. language = 'Chinese' #静态属性
    3. def __init__(self, teacher, course_name, period, price):
    4. self.teacher = teacher
    5. self.name = course_name
    6. self.period = period
    7. self.price = price
    8. def func(self): #动态属性
    9. pass

     现在我们就创建了一个Course类,类里面可以定义两种属性:静态属性和动态属性。

    🌄二、__dict__方法

    类的静态函数,类函数,普通函数,全局变量以及内置属性都放在类__dict__中,对象的__dict__中存储了self.xx的东西

    1. print(Course.__dict__)
    2. 输出结果:
    3. {'__module__': '__main__', 'language': 'Chinese',
    4. '__init__': 0x000002076A703EE0>,
    5. 'func': 0x000002076D26F5E0>,
    6. '__dict__': '__dict__' of 'Course' objects>,
    7. '__weakref__': '__weakref__' of 'Course' objects>, '__doc__': None}

    我们可以发现__dict__方法中包含Course中的所有属性,并且返回的是一个字典

    但是不可以通过直接修改字典的方法来改变类的静态属性

    1. Course.__dict__['language'] = 'Chinese'
    2. print(Course.language)
    3. 输出结果:
    4. Course.__dict__['language'] = 'Chinese'
    5. TypeError: 'mappingproxy' object does not support item assignment
    6. 翻译:TypeError:“mappingproxy”对象不支持项目分配

    但是可以用如下方法对类中的静态属性进行修改

    1. Course.language = 'English'
    2. print(Course.language)
    3. 输出结果:
    4. English

    🌄三、为实例化对象和类创建的内存空间

    我们首先实例化两个对象

    1. python = Course('Lisa','python','6 months',20000)
    2. linux = Course('Bob','linux','6 months',20000)

     其中实例化对象python和linux和Course类的内存空间的关系如下图:

     每当一个对象调用自己的属性时,会优先从自己的内存空间中寻找,如果找不到的话就到自己类的内存空间中寻找,如果还找不到的话就会报错。

    🌄四、静态属性修改知识点

    观察以下两个代码结果的区别和为什么会产生这种区别

    代码一

    1. class Course:
    2. language = 'Chinese'
    3. def __init__(self, teacher, course_name, period, price):
    4. self.teacher = teacher
    5. self.name = course_name
    6. self.period = period
    7. self.price = price
    8. python = Course('Lisa','python','6 months',20000)
    9. linux = Course('Bob','linux','6 months',20000)
    10. Course.language = 'English'
    11. print('Course:',Course.language)
    12. print('python: ',python.language)
    13. print('linux: ',linux.language)
    14. 输出结果:
    15. Course: English
    16. python: English
    17. linux: English

    代码二

    1. class Course:
    2. language = 'Chinese'
    3. def __init__(self, teacher, course_name, period, price):
    4. self.teacher = teacher
    5. self.name = course_name
    6. self.period = period
    7. self.price = price
    8. python = Course('Lisa','python','6 months',20000)
    9. linux = Course('Bob','linux','6 months',20000)
    10. python.language = 'English'
    11. print('Course:',Course.language)
    12. print('python: ',python.language)
    13. print('linux: ',linux.language)
    14. 输出结果:
    15. Course: Chinese
    16. python: English
    17. linux: Chinese

    绘图解释代码二出现的原因,没有改变类中的language,而是在Python命名空间中创建了一个language = 'Chinese'

    小结

    所以从以上我们可以得出一个结论

    1. 类中的静态变量 可以被对象和类调用
    2. 对于不可变数据类型来说,类变量最好用类名操作

    🌌1、del的使用

    因为代码二出现的原因,没有改变类中的language,而是在Python命名空间中创建了一个language = 'Chinese',所以之后python这个实例化的对象就再也拿不到类中的language静态属性了。

    但是用del python.language可以解决

    1. class Course:
    2. language = 'Chinese'
    3. def __init__(self, teacher, course_name, period, price):
    4. self.teacher = teacher
    5. self.name = course_name
    6. self.period = period
    7. self.price = price
    8. python = Course('Lisa','python','6 months',20000)
    9. linux = Course('Bob','linux','6 months',20000)
    10. python.language = 'English'
    11. print('Course:',Course.language)
    12. print('python: ',python.language)
    13. print('linux: ',linux.language)
    14. del python.language
    15. print('del 后 python: ',python.language)
    16. 输出结果:
    17. Course: Chinese
    18. python: English
    19. linux: Chinese
    20. del 后 python: Chinese

    🌄五、动态属性修改知识点

    上面的language = 'Chinese',中 'Chinese'是属于字符串是不可变的数据类型,如果换成language = [Chinese]这时列表是可变的数据类型,那么对动态属性修改与对静态属性的修改有什么区别呢?

    代码一

    1. class Course:
    2. language = ['Chinese']
    3. def __init__(self, teacher, course_name, period, price):
    4. self.teacher = teacher
    5. self.name = course_name
    6. self.period = period
    7. self.price = price
    8. python = Course('Lisa','python','6 months',20000)
    9. linux = Course('Bob','linux','6 months',20000)
    10. Course.language[0] = 'English'
    11. print('Course:',Course.language)
    12. print('python: ',python.language)
    13. print('linux: ',linux.language)
    14. 输出结果:
    15. Course: ['English']
    16. python: ['English']
    17. linux: ['English']

    代码二

    1. class Course:
    2. language = ['Chinese']
    3. def __init__(self, teacher, course_name, period, price):
    4. self.teacher = teacher
    5. self.name = course_name
    6. self.period = period
    7. self.price = price
    8. python = Course('Lisa','python','6 months',20000)
    9. linux = Course('Bob','linux','6 months',20000)
    10. python.language[0] = 'English'
    11. print('Course:',Course.language)
    12. print('python: ',python.language)
    13. print('linux: ',linux.language)
    14. 输出结果:
    15. Course: ['English']
    16. python: ['English']
    17. linux: ['English']

    结果示意图

    🌌1、小结

    对于可变数据类型来说,对象名的修改是共享language[0] = 'Chinese'的, 重新赋值(language = 'Chinese')是独立的

    📚结语

     

    📙:感谢各位能够看到这里💖💖💖:在鲁迅一篇未发表的文章中说过:“代码看懂了不是懂✨一定要自己实际操作哇✨这样才能更好的理解和吸收。”
    最后来一句:一个人可以在任何他怀有无限热忱的事情上成功,让我们一起进步吧✨

  • 相关阅读:
    快速排序(非递归)和归并排序
    苹果cms翻译插件-免费苹果CMS自动采集翻译
    群晖 DSM 7.0 Synology Photos IOS | Android 客户端下载
    vscode前端常用插件
    仿黑马点评-redis整合【四 优惠卷秒杀(上) 】
    md-editor-v3拓展工具栏失效的问题
    iOS源码-工程目录讲解
    C#实现FFT(递归法)
    Controller返回JSON数据
    2022-09-18 Docker 基础命令
  • 原文地址:https://blog.csdn.net/weixin_64471900/article/details/126571678