oldboy 22th day. I love Python. 面向对象之反射, 伪装成属性的方法

一 , 课前小甜点
二, 昨日内容
  抽象类: 一种规范;
  接口类:
  多态: 鸭子类型
  面向对象三大特性: 封装, 继承, 多态.
三, 今日内容:
  属性:
    定义: 类似于属性的方法? 有些名词的属性, 需要通过一些计算才能得到, 如果,直接 将他封装 虽然也可以 但是显的比较low所以 还是需要把他写成函数,然后在该函数上面加个 @property 的语法糖 这样看起来就很炫了. 官方名词叫做: 将方法伪装成属性, 虽然在代码层次上没有高深之处, 只是为了让看起来更合理.


    属性的改: 比较复杂, 因为, 这个伪装成属性的东西, 本质上还是方法, 如果想改值的话, 需要再次设置一个函数, 跟伪装的函数的函数名字 保持一致, 并且,在函数上面加一个装饰器(@伪装函数的函数名.setter ) 这样就可以实现 改的操作.


    属性的删除:  跟上面的操作差不多 只不过 是把装饰器改成(@函数名.deleter )

    总结:  将方法伪装成属性 本意是为了 让逻辑看起来更加的合理, 如果不这样修饰代码,  不会影响代码的运行, 却会影响可读性, 对于维护 肯能比较麻烦, 用起来的话, 也就第一个的 property 用的比较多,  setter 和 deleter 看起来更像是一个自欺欺人的用法.  犹如鸡肋, 食之无味弃之可惜, 不过 应该总有一些 刁难的 需求, 需要用到这里,  希望以后真的碰到的时候, 我可以想到这里.
  

  类方法: 被@classmathod 装饰的方法,叫做 类方法. 调用时, 会自动讲类空间传给第一个参数. 默认第一个位置形参名字叫 cls

  静态方法: 被@staticmethod 装饰的方法 就叫静态方法, 调用时, 不会自动将类空间,或者对象空间传进去.

  反射: 通过字符串操作一个空间.(对象)
    getatter(参数1, 参数2 ) 从参数1 的类里面得到 name属性的值.
    hasatter(obj, name) 判断 obj类里面有没有 name 属性
    setatter(obj, key, value) 给 obj类 添加一个值为value的属性名为 key.
    delatter(obj, name)删除obj 类里面的 属性name


   总结: obj 后面的参数 必须都是字符串; 因为 python里面 万物皆对象, 所以, 模块也可以作为对象 来getatter 等等来反射.

   归根结底, 反射的这种用法, 是在从别人处得到的 一些明明是 变量的名字的数据, 却是一种字符串的形式,  要用反射, 才比较方便.

猜你喜欢

转载自www.cnblogs.com/Fushengliangnian/p/9259495.html