类的封装和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)

 

posted @ 2019-06-20 23:35  蜗牛少少  阅读(242)  评论(0编辑  收藏  举报