开发者学堂课程【Python 语言基础 3:函数、面向对象、异常处理:封装简介】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/601/detail/8747
封装简介
内容简介
一、封装是面向对象的三大特性之一
二、如何隐藏一个对象中的属性
三、如何获取(修改)对象中的属性
四、使用封装,确实增加了类的定义的复杂程度,但也确保了数据的安全性
一、封装是面向对象的三大特性之一
封装指的是隐藏对象中的一些不希望被外部所访问到的属性或方法。
简单说就是一些内部自己用的属性或方法不希望被外部所访问的,这时候就要封装起来。所以,封装就是隐藏不希望被外部所访问到的属性或方法。
举一个狗的例子: 表示狗的类,里边有四个属性。
class Dog:
def
init(self , name , age , gender- ,height):
self. name = name
self.age = age
self. gendergender
self. height = height
现在就只留一个name属性,
class Dog:
def
init(self , name):
self. name = name
创建一个d=Dog(‘旺财’)
print(d.name)
然后执行出现:
旺财
Rep1 Closed
当然也可以改,在下边创建一个d.name=
‘小黑
’
保存、执行会出现:
小黑
Rep1 Closed
也就是说 name 属性既可以读取也可以修改,但是现在 name 属性没有用到封装,既然是要封装就涉及到两个问题:一是藏起来,二是露出来一部分。不希望被访问的就要藏起来,但有一些东西是希望被访问的就要露出来。
二、如何隐藏一个对象中的属性
class Dog:
def
init(self , name):
self. name = name
现在这个 name 属性不希望被访问,把它藏起来,最简单的方法就是将对象的属性名称修改为一个外部不知道的名字。比如说修改成
class Dog:
def
init(self , name):
self. hidden
name = name
现在 self 里 边的属性是 hidden name 不叫name 了,现在修改 name 就没有效果了。这里定一个方法:
def say
hello(self)
print(‘大家好,我是%s’%self.hidden
name)
这里注意现在属性就不能用name 表示了,要用 hidden name,因为刚才已经把属性名改成了 hidden name。这时候直接d.say
hello()
保存执行就变成了:
大家好,我是 旺财
Rep1 Closed
所以这时候修改 name 已经没有效果了,被隐藏起来了叫做 hidden name。要注意,现在没有一种方式可以把属性完全的藏起来。所以现在藏起来已经学会了。
三、如何获取(修改)对象中的属性
class Dog:
def
init(self , name):
self. hidden
name = name
def say
hello(self)
print(‘大家好,我是%s’%self.hidden
name)
现在属性已经藏起来了,简单来说现在 hidden name 是不被外部所访问的,但是内部是可以访问的,这个时候希望在外部也可以获取到 hidden name 就需要一个通用的方法,提供 getter 和 setter 方法使外部可以访问到属性。
getter 获取对象中的指定属性(get 属性名)这是 getter 方法,比如现在希望外部可以访问到 hidden name 就要 def get name(self) 注意这里要用真实的属性名,hidden name 是隐藏的属性名。然后 g et name()用来获取对象的 name 属性,这时候直接 return self.hidden name 如下
class Dog:
def
init(self , name):
self. hidden
name = name
def say
hello(self)
print(‘大家好,我是%s’%self.hidden
name)
def get
name(self)
get
name()用来获取对象的name属性
return self.hidden
name
这时候在最后 print(d.get name())执行就会出现:
旺财
Rep1 Closed
这个就是 get name()用来获取对象属性的方法。
Setter用来设置对象的指定属性(set 属性名),现在尝试定一个 setter 方法,这里注意 setter 不能仅有一个参数了,因为setter是设置、修改属性,所以还需要加一个参数def set
name(self,name):
这里的 name 代表的是你希望把它改成什么的一个值,这时候self.hidden
name=name
如下:
class Dog:
def
init(self , name):
self. hidden
name = name
def say
hello(self)
print(‘大家好,我是%s’%self.hidden
name)
def get
name(self)
get
name()用来获取对象的name属性
return self.hidden
name
def set
name(self,name):
self.hidden
name=name
这时候如果想改这个属性的话可以在下边写一个# 调用 setter 来修改 name 属性,直接d
.set
name(‘小黑’)
如下:
class Dog:
def
init(self , name):
self. hidden
name = name
def say
hello(self)
print(‘大家好,我是%s’%self.hidden
name)
def get
name(self)
get
name()用来获取对象的name属性
return self.hidden
name
def set
name(self,name):
self.hidden
name=name
# 调用 setter 来修改 name 属性
d.set
name(‘小黑’)
print(d.get
name()
)
然后执行变成
小黑
Rep1 Closed
如果调一下 say hello(),改之前和改之后都调一下,
d=dog(‘旺财’)
d.say
hello()
# 调用 setter 来修改 name 属性
d.set
name(‘小黑’)
d.say
hello()
#print(d.get
#print(d.get)
执行后出现
大家好,我是 旺财
大家好,我是 小黑
小黑
Rep1 Closed
开始是旺财,后来变成小黑了,也就是说现在通过 set name(‘小黑’)把属性给改了,所以这是一个通用的方式,第一需要把属性名藏起来,第二种方式通过get
name(self):
获取到属性,通过set
name(self,name)
:设置属性,这就是最通用的方式。这样做虽然麻烦但是曾经了数据的安全性。
四、使用封装,确实增加了类的定义的复杂程度,但也确保了数据的安全性
1、隐藏了属性名,是调用者无法随意的修改对象中的属性
2、增加了 getter 和 setter 方法,很好的控制了属性是否是只读的
如果希望属性是只读的,则可以直接去掉 setter 方法
如果希望属性不能被外部访问,则可以直接去掉 getter 方法。
3、使用 setter 方法设置属性,可以增加数据验证,确保数据的值是正确的。
4、使用 getter 方法获取属性,使用 setter 方法设置属性,可以在读取属性和修改属性的同时做一些其他的处理。