• 面向对象之封装


    一.什么是封装

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

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

    二.为什么需要封装

      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)
    万般皆下品,唯有读书高!
  • 相关阅读:
    C# linq根据属性分组,并累加计算
    AR模板分组显示(C#打印)
    显示单据信息(类似打印)
    C#同步方法中调用异步方法
    win10 Git安装或者使用出现128问题
    简单的分页查询实现
    数据库批量插入【数据库】
    VideoView
    音乐播放
    画画板案例
  • 原文地址:https://www.cnblogs.com/s686zhou/p/11250432.html
Copyright © 2020-2023  润新知