zoukankan      html  css  js  c++  java
  • python-类的封装(私有属性,私有方法)

    封装的定义

    • 封装就是一个保护的屏障,防止该类中的代码和数据被外部访问
    • 要访问该类的代码和数据必须经过严格的接口控制
    • 封装最重要的功能是在于我们可以修改自己实现的代码,而不用修改那些调用我们代码的程序段

    对属性的封装-私有属性

    • 引子
    class Integral(object):
        # 积分类
        def __init__(self, validity, number, business):
            """
            积分类初始化
            :param validity: 积分的有效期
            :param number: 积分的分数
            :param business: 哪块业务的积分
            """
            self.validity = validity
            self.number = number
            self.business = business
    
    
    jifen = Integral("2020-04-05", "100", "淘宝")
    
    print(jifen.validity)  # 此时我在外面随便可以访问到有效期
    jifen.validity = "2020-03-01"
    print(jifen.validity)  # 此时我在外面可以随意的修改积分的有效期,但是你想想在业务的角度上看这样合理么?是不是需要规范一下,不能让他修改这个有效期
    
    • 如何让外部调用时,不能随意的修改呢
      • 初始化成员变量时,定义的变量前面加两个下划线____,代表这是一个私有属性,只能类的内部访问,出了内部就不能访问他了
    class Integral(object):
        # 积分类
        def __init__(self, validity, number, business):
            """
            积分类初始化
            :param validity: 积分的有效期
            :param number: 积分的分数
            :param business: 哪块业务的积分
            """
            self.__validity = validity
            self.number = number
            self.business = business
    
    
    jifen = Integral("2020-04-05", "100", "淘宝")
    
    print(jifen.__validity)  # 此时我在外面随便可以访问到有效期
    jifen.validity = "2020-03-01"
    
    控制台输出:
    AttributeError: 'Integral' object has no attribute '__validity',找不到这个属性
    
    • 但是我在外部需要知道这个积分的有效期是多少该怎么办呢?
      • 利用私有属性在内部可以访问的特性,只需要写一个方法将这个私有属性的值返回出去即可
    class Integral(object):
        # 积分类
        def __init__(self, validity, number, business):
            """
            积分类初始化
            :param validity: 积分的有效期
            :param number: 积分的分数
            :param business: 哪块业务的积分
            """
            self.__validity = validity
            self.number = number
            self.business = business
    
        def get_validity_values(self): 
    		# 这样做有什么好处呢?
    		# 1,在外部不可以直接访问
    		# 2,要想修改有效期,只能通过我的方法,进行逻辑判断后才可以,防止了外部造假
    		if self.business == '淘宝':
                self.__validity = "2100-04-05"
            else:
                self.__validity = "1998-04-05"
            return self.__validity
    
    jifen = Integral("2020-04-05", "100", "淘宝")
    
    print(jifen.get_validity_values())
                
    控制台输出:
    2100-04-05
    
    • 对类方法的封装-私有方法

      • 积分是不能随意累加的,所以积分的方法外部不能随意修改值,如果要查看或者修改积分的值必须调用私有方法

        __add_number()方法

    class Integral(object):
        # 积分类
        def __init__(self, validity, number, business,is_buy):
            """
            积分类初始化
            :param validity: 积分的有效期
            :param number: 积分的分数
            :param business: 哪块业务的积分
            :is_bug: 是否购买了东西
            """
            self.__validity = validity
            self.number = number
            self.business = business
            self.__is_bug = is_buy
    
        def __add_number(self):
            """
            私有方法:如果买东西了,积分增加20,如果没有购买东西,告知用户:您没有购买东西,积分不累加
            :return:
            """
            if self.__is_bug == str(1):
                self.number += 20
            else:
                print("您没有购买东西,积分不累加")
            return self.number
    
        def get_number_values(self):
            return self.__add_number()
    
    jifen = Integral("2020-04-05", 100, "淘宝",'2')
    
    print(jifen.get_number_values())
    

    私有属性or私有方法外部肯定不能访问么》?

    • 其实是有方法的
      • 格式:实例名._类名__方法名
    class Integral(object):
        # 积分类
        def __init__(self, validity, number, business,is_buy):
            """
            积分类初始化
            :param validity: 积分的有效期
            :param number: 积分的分数
            :param business: 哪块业务的积分
            :is_bug: 是否购买了东西
            """
            self.__validity = validity
            self.number = number
            self.business = business
            self.__is_bug = is_buy
    
        def __add_number(self):
            """
            私有方法:如果买东西了,积分增加20,如果没有购买东西,告知用户:您没有购买东西,积分不累加
            :return:
            """
            if self.__is_bug == str(1):
                self.number += 20
            else:
                print("您没有购买东西,积分不累加")
            return self.number
    
        def get_number_values(self):
            return self.__add_number()
    
    jifen = Integral("2020-04-05", 100, "淘宝",'2')
    
    jifen._Integral__add_number() 
    jifen._Integral__validity = "2020-04-06" # 对私有属性的值进行修改
    
    控制台输出:
    您没有购买东西,积分不累加
    
  • 相关阅读:
    IDEA debug漏洞第一篇(weblogic,cve-2017-10271)
    IDEA+docker,进行远程漏洞调试(weblogic)
    2019-2020-1 20199326《Linux内核原理与分析》第四周作业
    2019-2020-1 20199326《Linux内核原理与分析》第三周作业
    2019-2020-1 20199326《Linux内核原理与分析》第二周作业
    2019-2020-1 20199326《Linux内核原理与分析》第一周作业
    DEV插件下的控件Grid和Gridlookupedit控件的结合使用
    foreach循环的简单写法
    dev设置子窗体的初始位置,grid控件表头的属性设置
    C#中,用户控件UserControl里面用Panl加载UserControl,并实现利用委托互相传值
  • 原文地址:https://www.cnblogs.com/shanshan-test/p/12885740.html
Copyright © 2011-2022 走看看