zoukankan      html  css  js  c++  java
  • 封装

    封装是什么意思

    从封装本身意思去理解,封装就好像是拿来一个麻袋,把小猫,小狗,小王八,一起装进麻袋,然后把麻袋封上口子

    如何隐藏:把东西包装进去之后,隐藏起来,外部访问不到

    如何用代码实现隐藏

    隐藏属性/隐藏方法:隐藏之后,外部访问不到,只有内部能访问

    隐藏属性:通过__变量名来隐藏

    隐藏方法:通过__方法名来隐藏

    #name隐藏起来
    #隐藏属性是为了安全
    class Person:
        def __init__(self,name,age):
            self.__name=name
            self.__age=age
    
        def get_name(self):
            return '名字是%s'%self.__name
    
    p=Person('nick',89)
    # print(p.age)
    #访问name
    # print(p.name)
    # print(p.__name)
    # print(p.get_name())
    # 隐藏的属性访问不到?实际上有方法能访问到
    #通过变形隐藏了属性
    print(p.__dict__)
    print(p._Person__name)
    
    #隐藏方法:隔离复杂度
    class Person:
        def __init__(self,name,age):
            self.__name=name
            self.__age=age
        def __speak(self):
            print('1111')
    
    p=Person('nick',89)
    p.__speak()
    print(Person.__dict__)
    p.__Person__speak()
    
    #什么时候属性变形,只要再类内部,以__变量名 命名的变量,都会被隐藏,会发生的变形,在外部放入的  __变量名 属性是不隐藏的
    class Person:
        def __init__(self,name,age):
            self.__name=name
            self.__age=age
        def set_xx(self,xx):
            self.__xx=xx
    
    p=Person('nick',18)
    ._p_xx='xxx'#不隐藏
    p.set_xx('6688')
    print(p.__dict__)
    

    property装饰器

    # 计算人的bmi指数
    # property装饰器:把方法包装成数据属性
    class Person:
        def __init__(self,name,height,weight):
            self.name=name
            self.height=height
            self.weight=weight
        @property
        def bmi(self):
            return self.weight/(self.height**2)
            # return self.weight/(self.height*self.height)
    p=Person('lqz',1.82,70)
    # print(p.bmi())
    print(p.bmi)
    
    
    

    property之setter和deleter

    class Person:
        def __init__(self,name,height,weight):
            self.__name=name
            self.__height=height
            self.__weight=weight
        @property
        def name(self):
            return '[我的名字是:%s]'%self.__name
        #用property装饰的方法名.setter
        @name.setter
        def name(self,new_name):
            # if not isinstance(new_name,str):
            if type(new_name) is not str:
                raise Exception('改不了')
            if new_name.startswith('sb'):
                raise Exception('不能以sb开头')
            self.__name=new_name
    
        # 用property装饰的方法名.deleter
        @name.deleter
        def name(self):
            # raise Exception('不能删')
            print('删除成功')
            # del self.__name
    
    p=Person('lqz',1.82,70)
    # print(p.name)
    # p.name='pppp'
    # p.name='xxx'
    #改不了,直接抛一异常
    # p.name=999
    # p.name='sb_nick'
    
    # print(p.name)
    
    del p.name
    print(p.name)
    
  • 相关阅读:
    Java基础101 给c:forEach的select下拉框中的值,设置默认值(后台传值,前台默认选中)
    Java进阶知识27 SSH整合(Struts2、Spring、Hibernate)
    错误/异常:org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in ServletContext resource [/WEB-INF/classes/beans_common.xml]...的解决方法
    Java进阶知识26 Spring与Hibernate整合到一起
    Java进阶知识25 Spring的事务管理(事务回滚)
    spring各个版本源码
    sql之left join、right join、inner join的区别
    git命令之git stash 暂存临时代码
    apollo配置相关
    idea快捷键
  • 原文地址:https://www.cnblogs.com/aden668/p/11426158.html
Copyright © 2011-2022 走看看