zoukankan      html  css  js  c++  java
  • 类的封装和preperty装饰器

    封装

    封装数据的主要原因:保护隐私

    封装方法的主要原因:隔离复杂度

    提示:在编程语言里,对外提供的接口(入口函数),就是接口函数,这不同于于接口的函数,代表一组接口函数的集合体

    两个层面的封装

    ### 第一层面的封装(什么都不用做)

    创建类和对象会分别创建二者的名称空间,我们只能用.类名或者.obj.的方法去访问

    注意:对于这一层面的封装(隐藏):类名和实例名就是访问隐藏属性的接口

    第二层面的封装:

    类中把某些属性和方法隐藏(或者说定义为私有),只有在类的内部使用,外部无法访问,或者留下少量接口(函数)供外部访问

    在python中用双下划綫的方式实现隐藏属性(设置为私有)

     

     

    property装饰器

    • property装饰器用于将被装饰的方法伪装成一个数据属性,在使用时可以不用加括号而直接使用

    property属性的定义和调用需注意:

    1. 定义时,在实例方法的基础上添加@property装饰器,并且只有一个self参数

    2. 调用时无需括号

    property属性的功能是:property属性内部进行一系列的逻辑运算,最终将计算结果返回

    property属性的两种方式

    1. 装饰器,在方法上应用装饰器

    2. 类属性,在类中定义值为property对象的类属性

    装饰器

    经典中。具有一种@property装饰器

    对应了一种访问方式,其对应被@property修饰的方法

    新式类中,具有三种@property装饰器

    分别对应了 被@property @方法名.setter @方法名.deleter的修饰方法.

    类属性方式

    创建值为property对象的类属性

    注意:当使用类属性的方式创建property属性时。经典类和新式类无区别

    property方法中有四个参数

    1. 第一个参数是方法名,调用对象属性时自动触发方法

    2. 第二个参数是方法名,调用对象属性 =XXX时自动触发方法

    3. 第三个参数是方法名,调用del对象属性时自动触发执行方法

    4. 第四个参数是字符串,调用对象属性.__doc__,此参数是该属性的描述信息

    私有属性添加qetter和setter方法

    class Money(object):
       def __init__(self):
           self.__money = 0

       def getMoney(self):
           return self.__money

       def setMoney(self, value):
           if isinstance(value, int):
               self.__money = value
           else:
               print("error:不是整型数字")

    使用property升级qetter和setter方法

    class Money(object):
       def __init__(self):
           self.__money = 0

       def getMoney(self):
           return self.__money

       def setMoney(self, value):
           if isinstance(value, int):
               self.__money = value
           else:
               print("error:不是整型数字")

       # 定义一个属性,当对这个money设置值时调用setMoney,当获取值时调用getMoney
       money = property(getMoney, setMoney)


    a = Money()
    a.money = 100  # 调用setMoney方法
    print(a.money)  # 调用getMoney方法

    使用property取代setter和qetter

    重新实现一个属性的设置和读取方法,可做边界判断

    class Money(object):
       def __init__(self):
           self.__money = 0

       # 使用装饰器对money进行装饰,那么会自动添加一个叫money的属性,当调用获取money的值时,调用装饰的方法
       @property
       def money(self):
           return self.__money

       # 使用装饰器对money进行装饰,当对money设置值时,调用装饰的方法
       @money.setter
       def money(self, value):
           if isinstance(value, int):
               self.__money = value
           else:
               print("error:不是整型数字")


    a = Money()
    a.money = 100
    print(a.money)

     

  • 相关阅读:
    C# 延时不卡界面
    C++ 转C#
    CYQ数据库配置
    VB Modbus RTU CRC 校验
    开始写博客了
    简单工厂模式
    单例模式
    基础、hibernate目前应用的对比
    QT Creator 代码自动补全---快捷键设定
    C# CMD直接运行语句
  • 原文地址:https://www.cnblogs.com/zrx19960128/p/11062123.html
Copyright © 2011-2022 走看看