封装的目的是为了保护隐私,把不想让别人知道的东西封装起来。让我们通过一个例子来理解这个包
定义了 Student 类和实例化,每个实例都有自己的名称和分数。现在如果你需要打印一个学生的成绩,你可以定义函数print_score(),它是一个类外的函数。
class Student(object):
def __init__(self, name, score):
self.name = name
self.score = score
May = Student("May",90) # 须要提供两个属性
Peter = Student("Peter",85)
print(May.name, May.score)
print(Peter.name, Peter.score)
def print_score(Student): # 外部函数print_score(Student)
# print("%s's score is: %d" %(Student.name,Student.score)) # 普通 print 写法
print("{0}'s score is: {1}".format(Student.name,Student.score)) # 建议使用 Python 2.7 + .format优化写法
print_score(May)
print_score(Peter)
由于 Student 实例本身拥有数据,因此无需从外部函数访问数据。我们可以直接在 Student 类中定义访问数据的函数。这样,数据就被“封装”了。
“封装”是将抽象的数据和行为(或功能)结合起来,形成一个有机的整体(即类);封装的目的是增强安全性和简化编程。用户不需要知道具体的实现细节,只需要通过外部接口来使用类的成员,一个特定的访问权限。
而这些封装数据的函数是和Student类本身是关联起来的,我们称之为类的方法。那如何定义类的方法呢?
有必要使用对象自身。参考上面的例子,将print_score()函数写成类方法(Python2.7以后的版本,推荐使用.format输出写法):
class Student(object):
def __init__(self, name, score):
self.name = name
self.score = score
def print_score(self):
print("{self.name}'s score is: {self.score}".format(self=self)) # Python 2.7 + .format优化写法
May = Student("May",90)
Peter = Student("Peter",85)
定义类的方法:除了第一个参数是self之外,和普通函数一样。
实例调用方式:直接在实例变量上调用即可。除了self,不需要传递其他参数。注意,如果一个类的方法只需要self,不需要别的,调用这个方法时只需要instance_name.function_name()即可。
这样,当我们从外部看Student类时,只需要知道创建实例需要给出name和score,在Student类内部定义了如何打印。这些数据和逻辑是“封装的”。调用起来很简单,但是你不需要知道内部实现的细节。
封装的另一个好处是可以给Student类增加新的方法;这边的方法也可以要求传参,如新增定义compare 函数,如下:
class Student(object):
def __init__(self, name, score):
self.name = name
self.score = score
def print_score(self):
print("{self.name}'s score is: {self.score}".format(self=self)) # Python 2.7 + .format优化写法
def compare(self,s):
if self.score>s:
print("better than %d" %(s))
elif self.score==s:
print("equal %d" %(s))
else:
print("lower than %d" %(s))
May = Student("May",90)
Peter = Student("Peter",85)
May.print_score()
Peter.print_score()
May.compare(100)
May.compare(90)
May.compare(89)
本文为原创文章,版权归知行编程网所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ win10下如何安装python?09/07
- ♥ 最流行最实用的python插件,你用过吗?11/05
- ♥ 如何判断python中的数组是否为空09/08
- ♥ python有多个线程吗11/07
- ♥ python TestSuite 测试套件的使用10/25
- ♥ python堆和栈有什么区别09/21
内容反馈