跟老齐学Python之编写类之二方法


Posted in Python onOctober 11, 2014

数据流转过程

除了在类中可以写这种函数之外,在类中还可以写别的函数,延续上一讲的例子:

#!/usr/bin/env python

#coding:utf-8
class Person:

    def __init__(self, name, lang="golang", website="www.google.com"):

        self.name = name

        self.lang = lang

        self.website = website

        self.email = "qiwsir@gmail.com"
    def author(self):

        return self.name
laoqi = Person("LaoQi")

info = Person("qiwsir",lang="python",website="qiwsir.github.io")
print "Author name from laoqi:",laoqi.author()

print "Author name from info:",info.author()
#运行结果
Author name from laoqi: LaoQi

Author name from info: qiwsir

 看官可能已经注意了,这段代码比上一讲多了一个函数author(self),这个我们先不管,稍后会详细分解。首先看看数据是如何在这个代码中流转的。为了能够清楚,画一张图,所谓一图胜千言万语,有图有真相。

跟老齐学Python之编写类之二方法

定义类Person,然后创建实例laoqi=Person("LaoQi"),看官注意观察图上的箭头方向。laoqi这个实例和Person类中的self对应,它们都是引用了实例对象(很多时候简化说成是实例对象)。"LaoQi"是一个具体的数据,通过构造函数中的name参数,传给实例的属性self.name,在类Person中的另外一个方法author的参数列表中第一个就是self,表示要承接self对象,return self.name,就是在类内部通过self对象,把它的属性self.name的数据传导如author。

当运行laoqi.author()的时候,就是告诉上面的代码,调用laoqi实例对象,并得到author()方法的结果,laoqi这个实例就自动被告诉了author()(注意,self参数在这里不用写,这个告诉过程是python自动完成的,不用我们操心了),author方法就返回laoqi实例的属性,因为前面已经完成了laoqi与self的对应过程,所以这时候author里面的self就是laoqi,自然self.name=laoqi.name。

看官可以跟随我在做一个实验,那就是在author中,return laoqi.name,看看什么效果。因为既然laoqi和self是同一个实例对象,直接写成laoqi.name是不是也可以呢?

#!/usr/bin/env python

#coding:utf-8
class Person:

    def __init__(self, name, lang="golang", website="www.google.com"):

        self.name = name

        self.lang = lang

        self.website = website

        self.email = "qiwsir@gmail.com"
    def author(self):

        #return self.name

        return laoqi.name       #返回
laoqi = Person("LaoQi")

info = Person("qiwsir",lang="python",website="qiwsir.github.io")
print "Author name from laoqi:",laoqi.author()

print "Author name from info:",info.author()
#输出结果

Author name from laoqi: LaoQi   #laoqi实例输出结果

Author name from info: LaoQi    #info实例输出结果

 从结果中可以看出,没有报错。但是,info这个实例输出的结果和laoqi实例输出的结果一样。原来,当调用了info实例之后,运行到author(),返回的是laoqi.name。所以,这里一定要用self实例。在调用不同的实例时,self会自动的进行匹配,当然,匹配过程是python完成,仍然不用我们操心。

OK,数据流转过程,看官是否理解了呢?下面进入方法编写的环节

为什么要用到方法

在类里面,可以用def语句来编写函数,但是,通常这个函数的样子是这样的:

class ClassName:

    def __init__(self,*args):

        ...

    def method(self,*args):     #是一个在类里面的函数

        ...

 在类ClassName里面,除了前面那个具有初始化功能的构造函数之外,还有一个函数method,这个函数和以前学习过的函数一样,函数里面要写什么,也没有特别的规定。但是,这个函数的第一个参数必须是self,或者说,可以没有别的参数,但是self是必须写上并且是第一个。这个self参数的作用前面已经说过了。

这样看来,类里面的这个函数还有点跟以前函数不同的地方。

类里面的这个函数,我们就称之为方法。

之所以用方法,也是用类的原因,也是用函数的原因,都是为了减少代码的冗余,提高代码的重用性,这也是OOP的原因。

方法怎样被重用呢?看本最开始的那段代码,里面有一个author方法,不管是laoqi还是info实例,都用这个方法返回实例导入的名字。这就是体现了重用。

编写和操作方法

编写方法的过程和编写一个函数的过程一样,需要注意的就是要在参数列表中第一个写上self,即使没有其它的参数。

#!/usr/bin/env python

#coding:utf-8
class Person:

    def __init__(self, name, lang="golang", website="www.google.com"):

        self.name = name

        self.lang = lang

        self.website = website

        self.email = "qiwsir@gmail.com"
    def author(self, address):

        #return self.name

        return laoqi.name+" in "+address
laoqi = Person("LaoQi")

info = Person("qiwsir",lang="python",website="qiwsir.github.io")
print "Author name from laoqi:",laoqi.author("China")

print "Author name from info:",info.author("Suzhou")
#运行结果
Author name from laoqi: LaoQi in China

Author name from info: LaoQi in Suzhou

 这段代码中,对author方法增加了一个参数address,当调用这个方法的时候:laoqi.author("China"),要对这个参数赋值,看官特别注意,在类中,这个方法显示是有两个参数(self,address),但是在调用的时候,第一个参数是自动将实例laoqi与之对应起来,不需要显化赋值,可以理解成是隐含完成的(其实,也可以将laoqi看做隐藏的主体,偷偷地更self勾搭上了)。

通过上面的讲述,看官可以试试类了。提醒,一定要对类的数据流通过程清晰。

Python 相关文章推荐
Python中实现的RC4算法
Feb 14 Python
在Python中用keys()方法返回字典键的教程
May 21 Python
Python通过DOM和SAX方式解析XML的应用实例分享
Nov 16 Python
Python调用ctypes使用C函数printf的方法
Aug 23 Python
python中Apriori算法实现讲解
Dec 10 Python
Python实现将HTML转成PDF的方法分析
May 04 Python
python批量修改图片尺寸,并保存指定路径的实现方法
Jul 04 Python
通过python扫描二维码/条形码并打印数据
Nov 14 Python
python飞机大战pygame碰撞检测实现方法分析
Dec 17 Python
python读取ini配置的类封装代码实例
Jan 08 Python
在tensorflow中设置保存checkpoint的最大数量实例
Jan 21 Python
告别网页搜索!教你用python实现一款属于自己的翻译词典软件
Jun 03 Python
Python中MYSQLdb出现乱码的解决方法
Oct 11 #Python
python操作mysql中文显示乱码的解决方法
Oct 11 #Python
wxPython窗口中文乱码解决方法
Oct 11 #Python
跟老齐学Python之编写类之一创建实例
Oct 11 #Python
跟老齐学Python之关于类的初步认识
Oct 11 #Python
跟老齐学Python之传说中的函数编写条规
Oct 11 #Python
python类继承用法实例分析
Oct 10 #Python
You might like
PHP实现求解最长公共子串问题的方法
2017/11/17 PHP
CI(CodeIgniter)框架中URL特殊字符处理与SQL注入隐患分析
2019/02/28 PHP
事件冒泡是什么如何用jquery阻止事件冒泡
2013/03/20 Javascript
document.addEventListener使用介绍
2014/03/07 Javascript
JavaScript中的迭代器和生成器详解
2014/10/29 Javascript
JavaScript插件化开发教程(五)
2015/02/01 Javascript
jquery简单实现外部链接用新窗口打开的方法
2015/05/30 Javascript
jquery实现像栅栏一样左右滑出式二级菜单效果代码
2015/08/24 Javascript
Bootstrap Img 图片样式(推荐)
2016/12/13 Javascript
解析JavaScript模仿块级作用域
2016/12/29 Javascript
AngularJS动态菜单操作指令
2017/04/25 Javascript
微信小程序页面生命周期详解
2018/01/31 Javascript
Angular父组件调用子组件的方法
2018/04/02 Javascript
微信小程序实现炫酷的弹出式菜单特效
2019/01/28 Javascript
微信小程序基于canvas渐变实现的彩虹效果示例
2019/05/03 Javascript
利用不到200行代码写一款属于你自己的js类库
2019/07/08 Javascript
vue中获取滚动table的可视页面宽度调整表头与列对齐(每列宽度不都相同)
2019/08/17 Javascript
[56:18]DOTA2上海特级锦标赛主赛事日 - 4 败者组第四轮#2 MVP.Phx VS Fnatic第二局
2016/03/05 DOTA
python监控网站运行异常并发送邮件的方法
2015/03/13 Python
python通过post提交数据的方法
2015/05/06 Python
Python运算符重载用法实例分析
2015/06/01 Python
Python编程实现双链表,栈,队列及二叉树的方法示例
2017/11/01 Python
python实现淘宝秒杀脚本
2020/06/23 Python
基于python cut和qcut的用法及区别详解
2019/11/22 Python
Python中sys模块功能与用法实例详解
2020/02/26 Python
Python查找不限层级Json数据中某个key或者value的路径方式
2020/02/27 Python
Python虚拟环境virtualenv创建及使用过程图解
2020/12/08 Python
一款利用纯css3实现的360度翻转按钮的实例教程
2014/11/05 HTML / CSS
canvas学习总结三之绘制路径-线段
2019/01/31 HTML / CSS
Oroton中国官网:澳洲知名奢侈配饰品牌
2017/03/26 全球购物
毕业生求职自荐书范文
2014/03/27 职场文书
高中综合实践活动总结
2014/07/07 职场文书
小学生感恩老师演讲稿
2014/08/28 职场文书
副检察长四风问题对照检查材料思想汇报
2014/10/07 职场文书
2015年乡镇党务公开工作总结
2015/05/19 职场文书
2015年幼儿园班主任个人工作总结
2015/10/22 职场文书