封装数据的主要原因:保护隐私
封装方法的主要原因:隔离复杂度
提示:在编程语言里,对外提供的接口(入口函数),就是接口函数,这不同于于接口的函数,代表一组接口函数的集合体
### 第一层面的封装(什么都不用做)
创建类和对象会分别创建二者的名称空间,我们只能用.类名或者.obj.的方法去访问
注意:对于这一层面的封装(隐藏):类名和实例名就是访问隐藏属性的接口
第二层面的封装:
类中把某些属性和方法隐藏(或者说定义为私有),只有在类的内部使用,外部无法访问,或者留下少量接口(函数)供外部访问
在python中用双下划綫的方式实现隐藏属性(设置为私有)
property装饰器
-
property装饰器用于将被装饰的方法伪装成一个数据属性,在使用时可以不用加括号而直接使用
property属性的定义和调用需注意:
-
定义时,在实例方法的基础上添加@property装饰器,并且只有一个self参数
-
调用时无需括号
property属性的功能是:property属性内部进行一系列的逻辑运算,最终将计算结果返回
property属性的两种方式
-
装饰器,在方法上应用装饰器
-
类属性,在类中定义值为property对象的类属性
装饰器
经典中。具有一种@property装饰器
对应了一种访问方式,其对应被@property修饰的方法
新式类中,具有三种@property装饰器
分别对应了 被@property @方法名.setter @方法名.deleter的修饰方法.
类属性方式
创建值为property对象的类属性
注意:当使用类属性的方式创建property属性时。经典类和新式类无区别
property方法中有四个参数
-
第一个参数是方法名,调用对象属性时自动触发方法
-
第二个参数是方法名,调用对象属性 =XXX时自动触发方法
-
第三个参数是方法名,调用del对象属性时自动触发执行方法
-
第四个参数是字符串,调用对象属性.__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的值时,调用装饰的方法