一 , 课前小甜点
二, 昨日内容
抽象类: 一种规范;
接口类:
多态: 鸭子类型
面向对象三大特性: 封装, 继承, 多态.
三, 今日内容:
属性:
定义: 类似于属性的方法? 有些名词的属性, 需要通过一些计算才能得到, 如果,直接 将他封装 虽然也可以 但是显的比较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 等等来反射.
归根结底, 反射的这种用法, 是在从别人处得到的 一些明明是 变量的名字的数据, 却是一种字符串的形式, 要用反射, 才比较方便.