zoukankan      html  css  js  c++  java
  • ~~核心编程(六):面向对象——封装~~

    进击のpython

    *****

    封装


    什么是封装呢?

    在前面是不是写过这样的代码

    class Dog:
        froom = "ch"
    
        def __init__(self, name, age, kind="erha"):
            self.blood = 100
            self.kind = kind
            self.age = age
            self.name = name
    

    在当时我是不是说__ini__下放的是实例的私有变量?

    其实这么说是不对的

    这只能说是实例变量,或者是成员变量

    当时只是为了让你能够好理解才那么表述的

    这才算是私有属性

    玩过角色扮演类游戏的都知道

    每个人物都是有基础属性且不可被修改的

    很明显,如果我还是像上面那么定义一个私有属性的话

    那我在外面就可以调用并且修改

    class Dog:
        froom = "ch"
    
        def __init__(self, name, age, kind="erha"):
            self.blood = 100
            self.kind = kind
            self.age = age
            self.name = name
    
        pass
    
    
    d = Dog("ponny", 3)
    
    d.blood += 10
    print(d.blood)
    

    但是我不想在外面修改,因为这毕竟算是个“不可变的”参数

    这就引出来我们要说的东西,封装

    封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问。

    要访问该类的代码和数据,必须通过严格的接口控制。

    封装最主要的功能在于我们能修改自己的实现代码,而不用修改那些调用我们代码的程序片段。

    适当的封装可以让程式码更容易理解与维护,也加强了代码数据的安全性。


    • 如何封装

      那怎么才能够把100这个数据进行封装呢?

      首先我们要先把他变成私有变量

      方法很简单

      前面加上“__”

      就是这样

      self.__blood = 100
      

      这样设定完之后,在外面就不会被调用

      看到了吧,当实例化之后,调用方法的时候就没有blood,更别说修改了,调都调不出来

      那封装的目的是保护数据,而不是看不到或者拿不到数据

      所以封装的第二步就是写一个函数,让私有变量参与进来

      class Dog:
          froom = "ch"
      
          def __init__(self, name, age, kind="erha"):
              self.kind = kind
              self.age = age
              self.name = name
              self.__boold = 100
      
          def fight(self):
              self.__boold -= 20
              print(f"受伤了,还剩{self.__boold}血量")
      
      
      d = Dog("ponny", 3)
      d.fight()
      
      受伤了,还剩80血量
      

      其实也可以看出来,虽然在外界能看到,但是拿到的其实是打印值(如果写的是return,拿到的就是返回值)

      而这些值,你都没有办法在外面修改,就相当于这个值变成了 只读 模式

      这就大大的加强了这个数据的安全性,对吧

      除非被函数操作修改,否则是不会被改变的

      以上的操作就是对blood这个属性的封装

      当然不止可以封装属性,也可以封装函数

      操作方法一样,在函数名前面加__

      同样,在外面无法直接调用

      只能通过类里面的函数调用

      class Dog:
          froom = "ch"
      
          def __init__(self, name, age, kind="erha"):
              self.kind = kind
              self.age = age
              self.name = name
              self.__boold = 100
      
          def __adod(self):
              print("需要加血!!!!")
      
          def fight(self):
              self.__boold -= 20
              print(f"受伤了,还剩{self.__boold}血量")
              self.__adod()
      
      
      d = Dog("ponny", 3)
      d.fight()
      
      受伤了,还剩80血量
      需要加血!!!!
      

      看,函数(方法)也是可以被封装起来的。(练几下)


    • 不能修改?

      真不能修改?

      不是的,是可以修改的

      这种机制也并没有真正意义上限制我们从外部直接访问属性,

      知道了类名和属性名就可以拼出名字:类名_属性

      然后就可以访问了

      print(d._Dog__boold)
      
      100
      

      而且能拿到就能改

      d._Dog__boold = 500
      
      print(d._Dog__boold)
      
      500
      

      所以其实还是能改的


    *有点东西*
    *继续深究*
  • 相关阅读:
    windows7 dos修改mysql root密码
    Windows7 安装完成mysql dos启动服务出现服务名称无效
    windows 环境下.Net使用Redis缓存
    SQLSERVER 使用 ROLLUP 汇总数据,实现分组统计,合计,小计
    Web Form 和asp.net mvc 差别
    SQL Server如何编辑超过前200行的数据
    附加数据库失败,操作系统错误 5:"5(拒绝访问。)"的解决办法
    MVC 架构
    关于打印代码
    关于WCF一些基础。
  • 原文地址:https://www.cnblogs.com/jevious/p/11207743.html
Copyright © 2011-2022 走看看