Python学习(七)面向对象——封装

王朝学院·作者佚名  2016-08-27
窄屏简体版  字體: 小  |  中  |  大  |  超大  

Python 类的封装

承接上一节,学了Student类的定义及实例化,每个实例都拥有各自的name和score。现在若需要打印一个学生的成绩,可定义函数PRint_score()

该函数为类外的函数,如下:

1classStudent(object):2def__init__(self, name, score):3self.name =name4self.score =score56May = Student("May",90)#须要提供两个属性7Peter = Student("Peter",85)8print(May.name, May.score)9print(Peter.name, Peter.score)1011defprint_score(Student):#外部函数print_score(Student)12#print("%s's score is: %d" %(Student.name,Student.score)) # 普通 print 写法13print("{0}'s score is: {1}".format(Student.name,Student.score))#建议使用 Python 2.7 + .format优化写法14print_score(May)15print_score(Peter)

既然Student实例本身就拥有这些数据,要访问这些数据,就没有必要从外面的函数去访问,我们可以直接在Student类的内部定义访问数据的函数。这样,就把数据给“封装”起来了。

“封装”就是将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体(即类);封装的目的是增强安全性和简化编程,使用者不必了解具体的实现细节,而只是要通过外部接口,一特定的访问权限来使用类的成员。

而这些封装数据的函数是和Student类本身是关联起来的,我们称之为类的方法。那如何定义类的方法呢?

就要用到对象 self 本身,参考上例,把 print_score() 函数写为类的方法(Python2.7之后的版本,推荐.format 输出写法):

1classStudent(object):2def__init__(self, name, score):3self.name =name4self.score =score56defprint_score(self):7print("{self.name}'s score is: {self.score}".format(self=self))#Python 2.7 + .format优化写法89May = Student("May",90)10Peter = Student("Peter",85)

定义类的方法:除了第一个参数是self外,其他和普通函数一样。

实例调用方法:只需要在实例变量上直接调用,除了self不用传递,其他参数正常传入;注意,若类的方法仅需要self,不需要其他,调用该方法时,仅需 instance_name.function_name()

这样一来,我们从外部看Student类,就只需要知道,创建实例需要给出name和score,而如何打印,都是在Student类的内部定义的,这些数据和逻辑被“封装”起来了,调用很容易,但却不用知道内部实现的细节。

封装的另一个好处是可以给Student类增加新的方法;这边的方法也可以要求传参,如新增定义compare 函数,如下:

1classStudent(object):2def__init__(self, name, score):3self.name =name4self.score =score56defprint_score(self):7print("{self.name}'s score is: {self.score}".format(self=self))#Python 2.7 + .format优化写法89defcompare(self,s):10ifself.score>s:11print("better than %d"%(s))12elifself.score==s:13print("equal %d"%(s))14else:15print("lower than %d"%(s))1617May = Student("May",90)18Peter = Student("Peter",85)1920May.print_score()21Peter.print_score()2223May.compare(100)24May.compare(90)25May.compare(89)

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航