小言_互联网的博客

python- 封装

306人阅读  评论(0)


封装很容易理解,就是把一个东西包起来。那么什么都能包起来吗,我还能打开它吗?今天我们就一起来聊一聊。


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
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场