[零基础学python]编写类之二方法

上一讲中建立了类,而且重点讲述了构造函数以及类实例,特别是对那个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勾搭上了)。

经过上面的讲述,看官能够试试类了。提醒,必定要对类的数据流经过程清晰。

相关文章
相关标签/搜索