星光

浅谈面向对象及其封装

id = 49909508

本文 Markdown 版本见此 ,如果看不惯WP,还是看MD吧

之前学习Flask框架时经常有地方看不懂,总结了下基本都是面向对象方面的,就又专门去补了下这方面的知识

本来在之前学PHP的时候感觉这方面知识很抽象,自己理解起来很虚,现在用Python理解了下,貌似解决了不少之前自己的疑惑,记录一下

本文前部分介绍下Python中的面向对象相关的代码设置,后半部分说下自己的脑洞理解,没有什么实际的生产力,但是我还是想钻一下牛角尖,不喜请无视,就不用回复吐槽我了

 


Python中类的声明

之前一直不知道加object是什么,看了下,这里括号里面的内容表示继承的父类,如果没有特定的父类,一律继承于object

给类添加属性和方法

 

需要特别注意的这里的 __init__ 函数,这就相对于PHP中的构造函数(别问我Python中的析构函数…PHP的析构函数我完全看不懂,Python不用操心手动释放内存就是好)

这个函数初始化了类中的一些属性,__init__函数的第一个参数必须是self,虽然这被钉子吐槽为Python中最SB的设定,但是我个人感觉还是比较有意义的,美不美就仁者见仁智者见智了

self表示的是类(对象)本身,self.name设定的就是类本身的name属性,这也便于了我们的区分和变量名复用(对象名默认大写)

 

如果设置得正确,上面三个name可以表示完全不同的name,而self的作用也得以凸显,没有self的话,在已有name的情况下,我们无法定义类本身特有的name属性

其实类似的设定,PHP中也有,就是 this ,所以我个人觉得这没什么。。可能我还没有学到感受到它设定的sb之处(或者说是学到那种程度)吧

需要注意的是,创建对象时记得要给__init__ 传参,否则会报错,如图

对象是类的实例化,创建对象的方法也很简单,类名括号+参数名即可

 

额。。我这是什么书写顺序啊。。原谅我吧

如截图所示,class中没有的属性,在实例化对象后还可以自己增加该对象的属性
一个类可以创建多个对象,然后就是一个类还可以继承其他类,继承的好处是默认拥有了父类的属性和方法,然后你可以很方便地在原有继承上进行扩展和重写

Python貌似不支持多继承,但是你可以单(父类)多次继承,默认继承于object类

好了,大概前半部分就写这么多吧。。都700字了,看完后,你应该也就没有我之前看到 object , 还有 实例化传参时摸不着头脑的感觉了吧


然后谈一下封装,封装的好处是不用关注实现细节,拿来用即可

第一层个人的感觉就是逻辑上更贴近人类思维,Python中有不少 file-like object,他们基本都是可以迭代的,也可以用read()方法去读

 

上面是我在 show-me-the-code 中写过的两个代码片段(第二个貌似忘记关了233,当时才学习惯不好)

其实第二个的 file-like object 我没有写出来,是类似于如下代码的对象

这两者都使用了read()方法,但是内部实现方式肯定截然不同,但是封装起来,大家直接用就可以了,然后用法也大致类似

这极大的方便了我们的使用,也能够让我们在各种不同的场景中能做到触类旁通,理解起来也非常便捷

如果没有面向对象的话,可能这两者的函数名都不相同,那样不说别的,记忆负担会加大不少

第二层的理解有些脑洞,但是我觉得也更接近本质了,因为本人没有接触相关的生产环境,在学校里也只学些基本的面向过程,说错了请别见怪

在对象之外直接访问对象的属性是不推荐的,看PHP书时,这句话我影响非常深刻,但是不怎么理解,后来想到,如果我们的对象里面存储的信息比较重要,并且不应该直接访问读取,那么怎么做好?

比如我们有一个Member类,实例化一个a用户,实例化过程中,a带上了各种属性,包括自己设定的密码以及系统分配的密钥(无视我的脑洞)

如果,直接访问的话:

 

可以任意读取和修改,非常不安全(这只是我脑补的人能输命令。。),而且比如说你让用户用a.paaswd去操作,它自己猜出了key属性,直接修改会怎么样?

但是如果我们封装成方法,然后设置为只能从内部访问,这样问题就解决了(具体参照这里,其实我也就昨天晚上看了下,今天写了文,具体的还得啃小老鼠)

 

加上方法还有一个好处就是可以增加一步验证,(传参传密码)如果你条件不匹配,就算猜到了方法名也改不了属性

然后我们给用户的时候,只要告诉他们去实例化对象,然后用我们封装好的这几个方法就可以了,他只能使用设定好的方法去处理问题,相对于内层的逻辑和数据他是不可见的,而只能使用你提供的接口,仅此而已

然后你也可以根据不同的权限封装不同的方法,来实现区别对待,权限高的用户可以使用一些别的用户用不了的方法

当然能修改源代码的人才是真正的最高权限了。。。想怎么弄就怎么弄,以上就是我的一点脑洞。。我猜测API、虚拟化开发,估计有些地方就用到了这个思想

大概是这样子,希望理解没有完全跑偏。。我想这也是为啥GUI界面不容易出问题,能交互输入的(比如表单)会有SQL注入等种种问题的原因之一吧。。

如果一个网站没有任何可以可见性(输入框)或者非可见性(黑客)输入的可能性的话,应该也是没有安全问题的吧

 

如无特殊声明,欢迎转载,但是请注明来自星之所在《浅谈面向对象及其封装》

评论

  1. Starlight #1

    打完要手动排列缩进。。。现在的习惯是两空格

    回复
    2015-04-21
    • Hooli

      两个空格不好读

      回复
      2015-04-22
      • Starlight

        确实,之前习惯4个空格,但是为了防止缩进太多,换了2个空格(貌似规范也是这样子的)

        回复
        2015-04-22
  2. 月月 #2

    没有花括号感觉好奇怪

    回复
    2015-04-22
    • Starlight

      Python的哲学是所见即所得,去除了花括号的缩进,强迫编码者写出短且直观的代码,习惯了,再看花括号会觉得略累赘。。所以以后如果要写JS我会尽量用coffee写

      回复
      2015-04-22
      • 月月

        CoffeeScript的写法被上司给禁止了,不让我用,说是逆潮流…可以用TypeScript或是AtScript…

        回复
        2015-04-22
        • Starlight

          …服了你上司了,你写完后编译成js不就可以了嘛。。反正咱不是生产环境,咱不操心这个

          回复
          2015-04-22
  3. CDog #3

    温故知新≧﹏≦
    记得当年刚接触面向对象的时候也是python,也是搞得云里雾里的_(:з)∠)_
    后来自学了java才慢慢开始了解233
    说得我都有点想重拾python了~\(≧▽≦)/~

    回复
    2015-04-22
  4. frantic1048 #4

    self 太容易和 this 写混了 _(:з」∠)_

    回复
    2015-05-6
    • Starlight

      头像萌 萌 哒!祝五月顺利~我想看你之后的手绘作品

      回复
      2015-05-6
      • frantic1048

        我会努力度过这次 BBQ 的 (゚∀。)

        我想学画好多萌萌的妹子 _(:з」∠)_

        回复
        2015-05-7