跟老齐学Python之类的细节


Posted in Python onOctober 13, 2014

这几天和几个朋友以各种途径讨论过OOP的相关问题,他们是:令狐虫、Frank、晋剑、小冯

大家对OOP有不同看法,所谓工程派和学院派看法不一致。从应用的角度看,工程派的观点是值得推荐的,那就是:不用太在意内部是怎么工作的,只要能够解决眼下的问题即可。但是,对于学习者而言,如果仅仅停留在工程派的层面(特别提醒,上述几位朋友都是工程派的大侠,他们可不是简单地能够使用,其实是更高层次的“无招胜有招”),学习者可能感觉有点不透彻。所以,学习者,特别是初学者,要知道一些内部原因,但是也别为了钻研内部原因而忘记了应用的目的。看来两者协调还是一个难办的事情。不用着急,随着实践的深入,就逐渐有体会了。

下面我根据MARK Lutz的《Learning Python》中的“大师眼中的OOP”,列一些使用OOP的常见原因。
 •代码重用。这是很简单(并且是使用OOP的最主要原因)。通过支持继承,类允许通过定制来编程,而不是每次都从头开始一个项目。
 •封装。在对象接口后包装其实现的细节,从而隔离了代码的修改对用户产生的影响。
 •结构。类提供了一个新的本地作用域,最小化了变量名冲突。他们还提供了一种编写和查找实现代码,以及去管理对象状态的自然场所。
 •维护性。类自然而然地促进了代码的分解,这让我们减少了冗余。对亏支持类的结构以及代码重用,这样每次只需要修改代码中一个拷贝就可以了。
 •一致性。类和继承可以实现通用的接口。这样代码不仅有了统一的外表和观感,还简化了代码的调试、理解以及维护。
 •多态。多态让代码更灵活和有了广泛的适用性。(这似乎是OOP的属性,不是使用它的理由)
 
不管怎么样,类是一个非常重要的东西,看官在学习的时候,一定要多加运用。

此外,对于python2来说,还有一个叫做“新式类”(new-style)的东西,这个对应于前面讲过的类,那么前面讲过的类就称为“经典”(classic)类。但是,对于Python3来讲,没有这种区别,二者融合。只是在Python2中,两个是有区别的。本教程在基础部分,依然不讲授新式类的问题,如果看官有兴趣,可以自己在GOOGLE中查找有关资料,也可以随着本课程深入,到下一个阶段来学习。

绑定和无绑定方法

看官是否还记得,在学习类的方法的时候,提到过,类的方法就是函数,只不过这个函数的表现有点跟前面学过的函数不一样,比如有个self。当然,也不是必须要有的,下面看官就会看到没有self的。既然方法和函数一样,本质上都是函数,那么,函数那部分学习的时候已经明确了:函数是对象,所以,类方法也是对象。正如刚才说的,类的方法中,有的可以有self,有的可以没有。为了进行区别,进一步做了这样的定义:
 •无绑定类方法对象:无self
 •绑定实例方法对象:有self
 
调用绑定实例方法对象

>>> class MyClass:

...     def foo(self,text):

...         print text

...

 可以用下面的方式调用实例方法

>>> a = MyClass()       #创建类实例

>>> a.foo('qiwsir.github.io')       #调用实例方法

qiwsir.github.io

>>> a.foo

<bound method MyClass.foo of <__main__.MyClass instance at 0xb74495ac>>

 在这个实例方法调用的时候,其数据传递流程,在《编写类之二方法》中有一张图,图中显示了,上述的调用方法中,其实已经将实例名称a传给了self,这就是调用绑定实例方法对象,有self。

上面的调用过程,还可以这样来实现:

>>> a = MyClass()

>>> x = a.foo       #把实例a和方法函数foo绑定在一起

>>> x

<bound method MyClass.foo of <__main__.MyClass instance at 0xb74495ac>>

>>> x("qiwsir.github.io")

qiwsir.github.io

 在上面的调用中,其实相当于前面的调用过程的分解动作。即先将实例a和方法函数foo绑定在一起,然后赋值给x,这时候x就相当于一个简单函数一样,可以通过上述方式传入参数。这里将实例和方法函数绑定的方式就是运用点号运算(object.method_function)

调用无绑定类方法对象

所谓类方法对象,就是不通过实例,而是用类进行点号运算来获得方法函数(ClassName.method_function)

>>> a = MyClass()

>>> y = MyClass.foo     #这里没有用类调用

>>> y

<unbound method MyClass.foo>

 这样的调用,就得到了无绑定方法对象,但是,调用的时候必须传入实例做为第一参数,如下

>>> y(a,"qiwsir.github.io")

qiwsir.github.io

 否则,就报错。请看官特别注意报错信息

>>> y("qiwsir.github.io")

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

TypeError: unbound method foo() must be called with MyClass instance as first argument (got str instance instead)

>>>

 在编程实践中,似乎用实例方法调用更多一下。

文档字符串

在写程序的时候,必须要写必要的文字说明,没别的原因,除非你的代码写的非常容易理解,特别是各种变量、函数和类等的命名任何人都能够很容易理解,否则,文字说明是不可缺少的。

在函数、类或者文件开头的部分写文档字符串说明,一般采用三重引号。这样写的最大好处是能够用help()函数看。

"""This is python lesson"""
def start_func(arg):

    """This is a function."""

    pass
class MyClass:

    """Thi is my class."""

    def my_method(self,arg):

        """This is my method."""

        pass

 这样的文档是必须的。

当然,在编程中,有不少地方要用“#”符号来做注释。一般用这个来注释局部。

类其实并没有结束,不过本讲座到此对类暂告一段。看官要多实践。

Python 相关文章推荐
Python3实现连接SQLite数据库的方法
Aug 23 Python
Python实现在matplotlib中两个坐标轴之间画一条直线光标的方法
May 20 Python
Django中URLconf和include()的协同工作方法
Jul 20 Python
Python通过调用mysql存储过程实现更新数据功能示例
Apr 03 Python
利用Python yagmail三行代码实现发送邮件
May 11 Python
利用django+wechat-python-sdk 创建微信服务器接入的方法
Feb 20 Python
Django自定义用户登录认证示例代码
Jun 30 Python
django创建最简单HTML页面跳转方法
Aug 16 Python
手把手教你进行Python虚拟环境配置教程
Feb 03 Python
python 牛顿法实现逻辑回归(Logistic Regression)
Oct 15 Python
python爬虫scrapy框架的梨视频案例解析
Feb 20 Python
python热力图实现的完整实例
Jun 25 Python
python修改注册表终止360进程实例
Oct 13 #Python
Python原始字符串(raw strings)用法实例
Oct 13 #Python
python中__call__方法示例分析
Oct 11 #Python
python多重继承实例
Oct 11 #Python
Python之PyUnit单元测试实例
Oct 11 #Python
采用Psyco实现python执行速度提高到与编译语言一样的水平
Oct 11 #Python
跟老齐学Python之编写类之四再论继承
Oct 11 #Python
You might like
菜鸟修复电子管记
2021/03/02 无线电
深入PHP与浏览器缓存的分析
2013/06/03 PHP
Thinkphp3.2实用篇之计算型验证码示例
2017/02/09 PHP
php获取linux命令结果的实例
2017/03/13 PHP
Javascript 匿名函数及其代码模式原理
2010/03/19 Javascript
javascript获取checkbox复选框获取选中的选项
2014/08/12 Javascript
Jquery 实现图片轮换
2015/01/28 Javascript
javascript动态创建链接的方法
2015/05/13 Javascript
Jquery中使用show()与hide()方法动画显示和隐藏图片
2015/10/08 Javascript
详解Angular.js的$q.defer()服务异步处理
2016/11/06 Javascript
JS+DIV实现的卷帘效果示例
2017/03/22 Javascript
jQuery中的deferred对象和extend方法详解
2017/05/08 jQuery
jQuery实现在HTML文档加载完毕后自动执行某个事件的方法
2017/05/08 jQuery
JS鼠标3次点击事件实现代码及扩展思路
2017/09/12 Javascript
基于Vue的ajax公共方法(详解)
2018/01/20 Javascript
6行代码实现微信小程序页面返回顶部效果
2018/12/28 Javascript
微信小程序聊天功能的示例代码
2020/01/13 Javascript
[38:21]2014 DOTA2国际邀请赛中国区预选赛5.21 TongFu VS LGD-CDEC
2014/05/22 DOTA
[01:07]2015国际邀请赛 中国区预选赛精彩回顾
2015/06/15 DOTA
[03:49]DOTA2 2015国际邀请赛中国区预选赛第二日现场百态
2015/05/27 DOTA
[02:12]探秘2016国际邀请赛中国区预选赛选手房间
2016/06/25 DOTA
Python中is与==判断的区别
2017/03/28 Python
基于python中的TCP及UDP(详解)
2017/11/06 Python
python jieba分词并统计词频后输出结果到Excel和txt文档方法
2018/02/11 Python
Python箱型图绘制与特征值获取过程解析
2019/10/22 Python
详解python环境安装selenium和手动下载安装selenium的方法
2020/03/17 Python
Python DES加密实现原理及实例解析
2020/07/17 Python
用pushplus+python监控亚马逊到货动态推送微信
2021/01/29 Python
早晨薰衣草在线女性精品店:Morning Lavender
2021/01/04 全球购物
木工主管岗位职责
2013/12/08 职场文书
2014年高考决心书
2014/03/11 职场文书
机关作风建设心得体会
2014/10/22 职场文书
2014工程部年度工作总结
2014/12/17 职场文书
计算机专业自荐信范文
2015/03/26 职场文书
2019年怎样才能撰写出优秀的自荐信
2019/03/25 职场文书
浅谈spring boot使用thymeleaf版本的问题
2021/08/04 Java/Android