封装很容易理解,就是把一个东西包起来。那么什么都能包起来吗,我还能打开它吗?今天我们就一起来聊一聊。
1、为什么要封装
相信每个人都不希望别人的手机连上自己的音响吧,我想听这个歌,你非要给我放那个,我又那你没办法。
例如:
class Dog():
name = '哈士奇'
def speak(lala):
print(f'我是{lala.name}')
dog = Dog()
dog.name = '德牧'
dog.speak()
dog.name = '二哈'
dog.speak()
我是德牧
我是二哈
这个代码中,我的狗的名字可以被别人随便改,这我当然不希望发生。
其实是有办法的,那就是封装。
2、怎么封装?
我要封装,就是希望别人找不到我的类中的属性,那我把这个属性隐藏起来就好了。
2.1 双下划线开头
这里可以使用双下划线开头的命名来隐藏属性,我们来看一下:
class Dog():
__name = '哈士奇'
def speak(lala):
print(f'我是{lala.__name}')
dog = Dog()
dog.__name
AttributeError Traceback (most recent call last)
in ()
6 # dog.__name = ‘德牧’
7 # dog.speak()
----> 8 dog.__name
AttributeError: ‘Dog’ object has no attribute ‘__name’
加了两个下划线,它就找不到这个属性了。
事实上,是只有在类的内部,才能访问或者修改这个属性。
class Dog():
__name = '哈士奇'
def speak(lala):
print(f'我是{lala.__name}')
dog = Dog()
dog.__name = '德牧'
dog.speak()
结果:
我是哈士奇
也就是说,这样的话,如果我们想要访问或者是修改这个属性,需要在类的内部自己定义一个方法,来进行访问和修改。关于这个我们后面再说。
- 事情的真相:
这个其实并不是真的隐藏起来了,它只是给这个属性自动的改了个名字,让你找不到它了。改名字的规则是这样的:__属性名
–>_类名__属性名
,我们可以尝试一下,还是刚才那个程序:
class Dog():
__name = '哈士奇'
def speak(lala):
print(f'我是{lala.__name}')
dog = Dog()
print(dog._Dog__name)
dog._Dog__name = '德牧'
dog.speak()
结果:
哈士奇
我是德牧
所以说,我们隐藏不是我们的目的,我们的目的就是给这个私有属性做一个标志,告诉别人不要更改它,所以我们通常使用下一种方式。
2.2 单下划线开头
一般,以单下划线开头的属性都是私有属性,这样做的好处:
- 方便书写
- 提醒别人这是私有属性
- 在外部可以访问和修改
3、封装的好处
- 封装是面向对象的三大特性之一
- 标志了私有属性
- 在类的内部定义了setter()和getter()方法,确保了数据安全,同时增加了数据验证。
- 增加了读改数据的复杂程度,同时确保了安全
4、完整的封装实例
class Dog():
def __init__(self,name,age):
self._name = name
if age>0:
self._age = age
else:
flag = input(f'您要输入的年龄是不是{-age}岁,y/n')
if flag == 'y':
self._age = -age
else:
print('您输入的年龄不合法')
def speak(lala):
print(f'我是{lala._name},我{lala._age}岁了')
def set_age(self,age):
self.age = age
dog = Dog('二哈',-12)
dog.speak()
您要输入的年龄是不是12岁,y/n
y
我是二哈,我12岁了
转载:https://blog.csdn.net/wander_ing/article/details/105981071
查看评论