封装是面向对象三大特征之一,另外两个是继承与多态
封装的顾名思义就是把类封闭包装那样理解。方便调用或者说使用、运用。
出现封装的原因:我们需要⼀种⽅式来增强数据的安全性
- 属性不能随意修改 2. 属性不能改为任意的值
- 封装是指隐藏对象中⼀些不希望被外部所访问到的属性或⽅法
我们也可以提供给⼀个getter()和setter()⽅法是外部可以访问到属性 getter() 获取对象中指定的属性 setter() ⽤来设置对象指定的属性 使⽤封装,确实增加了类的定义的复杂程度,但是它也确保了数据的安全 - 隐藏属性名,使调⽤这⽆法随意的修改对象中的属性 2. 增加了getter()和setter()⽅法,很好控制属性是否是只读的 3. 使⽤setter()设置属性,可以在呢及数据的验证 4. 使⽤getter()⽅法获取属性,使⽤setter()⽅法设置属性可以在读取属 性和修改属性的同时做⼀些其他的处理
可以为对象的属性使⽤双下划线开头 __xxx。双下划线开头的属性,是对象 的隐藏属性,隐藏属性只能在类的内部访问,⽆法通过对象访问
其实隐藏属性只不过是Python⾃动为属性改了⼀个名字 --> _类名__属性 名 例如 __name -> _Person__name 这种⽅式实际上依然可以在外部访问,所以这种⽅式我们⼀般不⽤。⼀般我
们会将⼀些私有属性以_开头 ⼀般情况下,使⽤_开头的属性都是私有属性,没有特殊情况下不要修改私有属性
实例:
#定义一个类,鱼
class fish:
def init(self,name,color,age):
self.hidd_name=name #名字
self.hidd_color=color #颜色
self.hidd_age=age #年龄
def move(self):
print('我是一条%s的鱼,我可以在水中游!'%self.hidd_color)
def get_name(self):
print('我的名字是:')
return self.hidd_name
# get_name()用来获取对象的name属性
def set_age(self,age):
print('修改了年龄,我长大了一岁')
if age>2:
self.hidd_age=age
def infomationg(self):
print('我的名字是:%s,我的年龄是%s岁,我的颜色是%s'%(self.hidd_name,self.hidd_age,self.hidd_color))
f=fish(‘金鱼’,‘金色’,3)
f.move()
#print(f.move())
print(f.get_name())
f.set_age(4)
f.get_name()
f.infomationg()
实例2:
class water:
def init(self,watername,mounth):
self._watername=watername
self._mou=mounth
def watern(self):
print('getter 方法执行')
print(self._watername)
return self._watername
def waternww(self,watername):
self._watername=watername
w=water(‘农夫山泉’,3)
#g=w.waterna()
w.watern()
w.waternww(‘昆仑山’)
w.watern()
#w.waterna()
输出结果:
getter 方法执行
农夫山泉
getter 方法执行
昆仑山
property装饰器,个人认为是为了更好地封装
可以使⽤@property装饰器来创建只读属性,@property装饰器会将⽅ 法转换为相同名称的只读属性,可以与所定义的属性配合使⽤,这样可以防⽌
属性被修改
实例:
class water:
def init(self,watername,mounth):
self._watername=watername
self._mou=mounth
# property装饰器 用来将一个方法转换为对象的属性
@property
def watern(self):
print('getter 方法执行')
print(self._watername,self._mou)
return self._watername
# setter方法的装饰器 @属性名.setter
@watern.setter
def waternww(self,watername):
self._watername=watername
w=water(‘农夫山泉’,3)
#g=w.waterna() # w.watern() # w.waternww(‘昆仑山’) # w.watern()
print(w.watern)
w.waternww=‘龙井’
print(w.watern
输出结果:
getter 方法执行
农夫山泉 3
农夫山泉
getter 方法执行
龙井 3
龙井