上一讲中建立了类,而且重点讲述了构造函数以及类实例,特别是对那个self,描述了很多。在讲述构造函数的时候特别提到,init()是一个函数,只不过在类中有一点特殊的做用罢了,每一个类,首先要运行它,它规定了类的基本结构。python
除了在类中能够写这种函数以外,在类中还能够写别的函数,延续上一讲的例子:git
#!/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),这个咱们先无论,稍后会详细分解。首先看看数据是如何在这个代码中流转的。为了可以清楚,画一张图,所谓一图胜千言万语,有图有真相。github
定义类Person,而后建立实例laoqi=Person("LaoQi"),看官注意观察图上的箭头方向。laoqi这个实例和Person类中的self对应,它们都是引用了实例对象(不少时候简化说成是实例对象)。"LaoQi"是一个具体的数据,经过构造函数中的name参数,传给实例的属性self.name,在类Person中的另一个方法author的参数列表中第一个就是self,表示要承接self对象,return self.name,就是在类内部经过self对象,把它的属性self.name的数据传导如author。golang
当运行laoqi.author()的时候,就是告诉上面的代码,调用laoqi实例对象,并获得author()方法的结果,laoqi这个实例就自动被告诉了author()(注意,self参数在这里不用写,这个告诉过程是python自动完成的,不用咱们操心了),author方法就返回laoqi实例的属性,由于前面已经完成了laoqi与self的对应过程,因此这时候author里面的self就是laoqi,天然self.name=laoqi.name。web
看官能够跟随我在作一个实验,那就是在author中,return laoqi.name,看看什么效果。由于既然laoqi和self是同一个实例对象,直接写成laoqi.name是否是也能够呢?segmentfault
#!/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语句来编写函数,可是,一般这个函数的样子是这样的:google
class ClassName: def __init__(self,*args): ... def method(self,*args): #是一个在类里面的函数 ...
在类ClassName里面,除了前面那个具备初始化功能的构造函数以外,还有一个函数method,这个函数和之前学习过的函数同样,函数里面要写什么,也没有特别的规定。可是,这个函数的第一个参数必须是self,或者说,能够没有别的参数,可是self是必须写上而且是第一个。这个self参数的做用前面已经说过了。spa
这样看来,类里面的这个函数还有点跟之前函数不一样的地方。
类里面的这个函数,咱们就称之为方法。
之因此用方法,也是用类的缘由,也是用函数的缘由,都是为了减小代码的冗余,提升代码的重用性,这也是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勾搭上了)。
经过上面的讲述,看官能够试试类了。提醒,必定要对类的数据流经过程清晰。