zoukankan      html  css  js  c++  java
  • python基础之封装与绑定方法

    封装

    1.什么是封装:

             封:属性对外隐藏,但对内开放

             装:申请一个名称空间,往里装入一系列名字/属性

    2.为什么要封装:

             封装数据属性:不让外部使用者直接使用数据,需要类内部开辟一个接口,让外部通过接口使用数据,好处在于可以在接口中定义各种规则

             封装函数属性:定义函数就是为了给类外部使用者的,隐藏函数属性是为了不让外部直接使用,需内部接口,然后接口去调用隐藏的功能

             封装的精髓是隔离复杂度

    3.如何封装(隐藏):在属性前加上__开头

             ①这种隐藏只是语法上的变形操作,类中__n其实是_类名__n

             ②该变形只是在类定义阶段发生一次

             ③这种隐藏是对外的,对内是开放的

             ④如果不想让子类的方法覆盖父类的,则可隐藏

    特性:property 

    将一个类的函数定义成特性以后,对象再去使用的时候obj.name,根本无法察觉自己的name是执行了一个函数然后计算出来的,这种特性的使用方式遵循了统一访问的原则

    封装的三种方法:

    class Foo:
        def __init__(self,val):
            self.__NAME=val #将所有的数据属性都隐藏起来
    
        @property      #
        def name(self):
            return self.__NAME #obj.name访问的是self.__NAME(这也是真实值的存放位置)
    
        @name.setter  #
        def name(self,value):
            if not isinstance(value,str):  #在设定值之前进行类型检查
                raise TypeError('%s must be str' %value)
            self.__NAME=value #通过类型检查后,将值value存放到真实的位置self.__NAME
    
        @name.deleter  #
        def name(self):
            raise TypeError('Can not delete')
    
    f=Foo('egon')
    print(f.name)
    # f.name=10 #抛出异常'TypeError: 10 must be str'
    del f.name #抛出异常'TypeError: Can not delete'

    绑定方法

             特性绑定给谁,就该谁来用,将第一个参数自动传入

             绑定方法分为两类:

             ①绑定给对象用:

                      在类内部定义的函数,默认都是绑定给对象使用的

             ②绑定给类使用:

                      若类中函数被@classmethod装饰,就是绑定给类的,类调用,自动将类作为第一个参数传入

             注:对象也可以使用绑定给类的方法,但是自动传入的还是对象所属的类

             绑定方法的精髓:自动传值

    非绑定方法:被@staticmethod装饰

             既不与类绑定,又不与对象绑定,意味着没有任何自动传值的效果,是一个普通函数

    应用:若函数体代码需要用到类,则绑定给类

               若函数体代码需要用到对象的值,则绑定给对象

               若函数体代码既不需要用到对象的值也不需要用到类,则使用非绑定方法

  • 相关阅读:
    Akka源码分析-Extension
    Akka源码分析-Remote-Creating Actors Remotely
    24-2 show构造方法
    day24-1构造方法
    day23-4 最小值-到最大值排序
    day23-4 最小值-到最大值冒泡排序
    day23-3 最大值-到最小值排序
    day23-2 倒叙
    day23-1 水仙花
    day22 随机输出ArrayList
  • 原文地址:https://www.cnblogs.com/luck-L/p/9238599.html
Copyright © 2011-2022 走看看