码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 21面向对象描述器


    目录

    1、什么是描述器?

    1、原始的代码可以理解成为这样:

    2、增加解释器可以改成如下,解释器就是集增删改查为一体的一个小的property

    有一点需要注意的地方是:property里面内置的参数不是get_age()就是不用调用。

    3、装饰器可以也放在前面

    一些小注意和补缺:self.age=value会发生无限递归,为什么 self.__age = value不会发生无限递归?

    4、有一个封装的思想,我觉得以后可能非常重要!!!

    5、但是这样写的话,Age()这个就是共享的了


    1、什么是描述器?

    其实是一个类里面的属性,指向一个特殊的对象,但是这个对象具有:增,删,改,查四种实例方法。在外界尝试去操作一个描述器,解释器会去判断是否是一个描述器,如果是,会自动把外界的赋值操作转化成__Set__操作,转化的操作是解释器自己完成的。不需要人为的操作

    1、原始的代码可以理解成为这样:

    1. class Person:
    2. def __init__(self):
    3. self.__age = 10
    4. def get_age(self):
    5. return self.__age
    6. def set_age(self,value):
    7. if value < 0:
    8. value = 0
    9. self.age = value
    10. def del_age(self):
    11. del self.__age
    12. p = Person()
    13. p.set_age(-100)
    14. print(p.get_age())
    15. p.del_age()
    16. print(p.get_age())

    2、增加解释器可以改成如下,解释器就是集增删改查为一体的一个小的property

    1. class Person:
    2. def __init__(self):
    3. self.__age = 10
    4. def get_age(self):
    5. return self.__age
    6. def set_age(self,value):
    7. if value < 0:
    8. value = 0
    9. self.__age = value
    10. def del_age(self):
    11. del self.__age
    12. age = property(get_age,set_age,del_age)
    13. name = 'sz'
    14. p = Person()
    15. p.age = 19
    16. print(p.age)

    有一点需要注意的地方是:property里面内置的参数不是get_age()就是不用调用。

    3、装饰器可以也放在前面

    1. class Person:
    2. def __init__(self):
    3. self.__age = 10
    4. @property
    5. def age(self):
    6. return self.__age
    7. @age.setter
    8. def age(self,value):
    9. if value < 0:
    10. value = 0
    11. self.__age = value
    12. @age.deleter
    13. def age(self):
    14. del self.__age
    15. # age = property(get_age,set_age,del_age)
    16. # name = 'sz'
    17. p = Person()
    18. p.age = 19
    19. print(p.age)

    一些小注意和补缺:self.age=value会发生无限递归,为什么 self.__age = value不会发生无限递归?

    答:self.age = value是设置值,self.__age = value是访问私有变量,为啥是访问私有变量?因为在python内部有一个名字重整机制,就是会把__age改成 _类名__age因此,self.__age = value 其实是直接访问了重命名后的属性 _类名__age,而不是通过属性的 setter 方法来设置。这就避免了无限递归的问题。但需要注意的是,这种方式是一种绕过属性的 getter 和 setter 方法的机制,可能会绕过属性的其他逻辑,因此在使用时需要谨慎考虑。

    4、有一个封装的思想,我觉得以后可能非常重要!!!

    1. class Age:
    2. def __init__(self):
    3. self.__age = 10
    4. def get_age(self):
    5. return self.__age
    6. def set_age(self,value):
    7. if value < 0:
    8. value = 0
    9. self.__age = value
    10. def del_age(self):
    11. del self.__age
    12. class Person:
    13. age = Age()
    14. p = Person()
    15. p.age = 19
    16. print(p.age)

    另外一个封装的案例

    1. class Age:
    2. def __get__(self, instance, owner):
    3. print('get')
    4. def __set__(self, instance, value):
    5. print('set')
    6. def __delete__(self, instance):
    7. print('我被删除啦')
    8. class Person:
    9. age = Age()
    10. p = Person()
    11. p.age = 10
    12. print(p.age)

    上面那块的增删改查,全部被封装在Age的这个函数里面了,下面只需要直接调用就可以了~

    class的Age也是一个类,但是在Person那块也是一个类,所以可以试着去调用类的方法看看能不能触发set和del的属性

    1. class Age:
    2. def __get__(self, instance, owner):
    3. print('get')
    4. def __set__(self, instance, value):
    5. print('set')
    6. def __delete__(self, instance):
    7. print('我被删除啦')
    8. class Person:
    9. age = Age()
    10. # p = Person()
    11. # p.age = 10
    12. # print(p.age)
    13. print(Person.age)
    14. Person.age = 19
    15. del Person.age

    结果如下:只会获得,但是不会,set和del了,所以以后用装饰器的时候,还是用对象去操作比较好!

    5、但是这样写的话,Age()这个就是共享的了

  • 相关阅读:
    前端开发之webpack
    Docker从入门到实战
    【MySQL】redo log 、 undo log、脏页这些概念是什么?
    聊聊异步编程的 7 种实现方式
    手撸promise【二、Promise源码】【代码详细注释/测试案例完整】
    Codeforces Round #815 (Div. 2)
    Java开发中如何配合MySQL实现读写分离?
    【MySQL 使用秘籍】克隆数据表、保存查询数据至数据表以及创建临时表
    3).基础平台与业务平台的关系
    国学短剧《我是小影星》栏目火热开拍
  • 原文地址:https://blog.csdn.net/weixin_44528463/article/details/133818507
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号