面向对象之封装

一.什么是封装

  封装就是将复杂的丑陋的,隐私的细节隐藏到内部,对外提供简单的使用接口

  对外隐藏内部实现细节,并提供访问的接口

二.为什么需要封装

  1.为了保证关键数据的安全性

  2.对外部隐藏实现细节,隔离复杂度

三.什么时候应该封装

  1.当有一些数据不希望外界可以直接修改时,

  2.当有一些函数不希望给外界使用时

四.如何使用:

1 class Person:
2     def __init__(self,id_number,name,age):
3           self.__id_number = id_number
4           self.name = name
5           self.age = age
6 p = Person('32030219961011002500','jack',18)

这里的id_number这个属性就被封装了,外界不可调用和查询,只能在类内部使用

1.被封装的内容的特点

  1.外界不能直接访问

  2.内部依然可以使用

2.权限:

  学习了封装后就可以控制属性的权限在Python只要两种权限:

    1.公开的,默认就是公开的

    2.私有的,只能由当前类自己使用

案例:封装类中的方法,为了隔离复杂度

 1 class PC:
 2 
 3     def __init__(self,price,kind,color):
 4         self.price = price
 5         self.kind = kind
 6         self.color = color
 7 
 8     def open(self):
 9         print('接通电源')
10         self.__check_device()
11         print('载入内核')
12         print('初始化内核')
13         self.__start()
14         print('启动GUI')
15         self.__login()
16     def __check_device(self):
17         print("硬件检测")
18         print("硬件检测")
19         print("硬件检测")
20         print("硬件检测")
21         print("硬件检测")
22 
23     def __start(self):
24         print('启动服务')
25         print('启动服务')
26         print('启动服务')
27         print('启动服务')
28         print('启动服务')
29 
30     def __login(self):
31         print('login')
32         print('login')
33         print('login')
34 pc1 = PC(2000,'apple','blue')
35 pc1.open()

 

五.在外界访问私有的内容

属性虽然被封装了,但是还是需要使用,在外界如何访问,通过定义方法类完成对私有属性的修改和访问

案例:

 1 class Downloader:
 2     def __init__(self,filename,url,buffer_size):
 3         self.filename = filename
 4         self.url = url
 5         self.__buffer_size = buffer_size
 6     
 7     def start_download(self):
 8         if self.__buffer_size <= 1024*1024 9             print('开始下载...')
10             print('当前缓冲器大小:'self.__buffer_size)
11         else:
12             print('内存炸了!')
13       
14     def set_buffer_size(self,size):
15         if not type(size) == int:
16             print('大哥 缓冲器必须是整形')
17         else:
18             print('缓冲区大小修改成功!')
19             self.__buffer_size = size
20     
21      def get_buffer_size(self):
22             return self.__buffre_size
23 
24 d = Downloader('葫芦娃','http://www.huluwa.com',1024*1024)
25 
26 #通过调用函数修改内部封装的属性
27 d.set_buffer_size(1024*512)
28 
29 #通过调用函数访问内部封装的属性
30 print(d.get_buffer_size())
31 
32 d.start_download()              

六.property装饰器

通过方法来修改或访问属性,本身没什么问题,但是这样给对象的使用者带来了不方便,使用必须知道那些是普通属性,哪些是私有属性,需要使用不同的方式来调用他们,property装饰器就是为了使得调用方式一致

下面有三个相关的装饰器:

1 1.@property  用在获取属性的方法上
2 2.@key.setter  用在修改属性的方法上
3 3.@key.deleter 用在删除属性的方法上

案例:

 1 class A:
 2     def __init__(self,name,key):
 3             self.__name__=name
 4             self.key = key
 5 
 6     @property
 7     def key(self):
 8         return self.__key
 9 
10     @key.setter
11     def key(self,new_key):
12         if new_key <= 100:
13             self.__key = new_key
14         else:
15             print('key必须小于等于100')
16     
17     @key.deleter
18     def key(self):
19         print("不允许删除该属性")
20         del self.__key
21 
22 a = A('jack',123)
23 print(a.key)
24 a.key = 321
25 print(a.key)

python实现封装的原理:

  就是在加载类的时候,把__替换成了_类名__  例如将__name 替换成了 _A__name

  封装就是对外部隐藏内部的实现细节,并提供访问的接口

  好处:

    1.提高安全性

    2.隔离复杂度

  访问被隐藏的属性:

    提供用于访问和修改的方法

    使用property装饰器可以将一个方法伪装成普通属性,属性之间的调用方法是一致的

property可以用来实现计算属性 

计算属性指的是:属性的值,不能直接获得,必须通过计算才能获取

案例:

class Square:
        def __init__(self,width):
            self.width = width
    
        @property
        def area(self):
            return self.width*self.width

s = Square(10)
print(s.area)
s.width = 20
print(s.area)
s.width =2
print(s.area)

 

posted @ 2019-07-26 15:05  s686编程传  阅读(188)  评论(0编辑  收藏  举报