目录
案例(set/get):
如果现在需要设计一个银行类,类中有姓名和金额,其中有几个需要注意的问题,首先要隐藏细节,不能让用户随便修改金额;如果确实要修改金额,则要提供访问访问接口(set/get方法),然后还要避免在操作类的 对象过程中的误操作,比如修改金额传入非法数据,为了保证数据的有效性,要对传入的数据进行判断。
# 银行类
class Account(object):
# 将属性私有,不能随便访问
def __init__(self, name, money):
self.__name = name # 帐户人姓名
self.__balance = money # 帐户余额
# 帐户人姓名,在创建帐户时就已经确定,不允许修改,所以对外不提供姓名的 set 方法
def get_name(self):
return self.__name
# 获取账户余额
def get_balance(self):
return self.__balance
# 对余额进行操作和判断
def set_balance(self,money):
if isinstance(money, int):
if money >= 0:
self.__balance = money
else:
raise ValueError('输入的金额不正确')
else:
raise ValueError('输入的金额不是数字')
解释:
为什么要使用 set/get 方法操作属性
为了不想让使用者直接操作对象中的属性,要设计成私有属性,当需要对私有属性进行修改时,就要使用set/get方法
如何对属性进行数据有效性控制
在set方法中加入判断,如果传入的数据无效,提示出错
使用 set/get 方法的好处
1、隐藏实现细节,不想让使用者直接操作对象中的属性,比如金额等,
2、为需要修改的属性提供访问接口,即通过set/get接口提供精确的访问控制
3、在set方法中对传入的数据有效性进行判断,保证数据有效性
即然 set/get 方法是用来操作属性的方法,那么能不能以属性操作的方式来使用呢?在 Python 中,提供了一个叫做 property 的类,通过对这个创建这个类的对象的设置property,在使用对象的私有属性时,可以不在使用属性的函数的调用方式,而像普通的公有属性一样去使用属性,为开发提供便利。
property
property类
property类:其实是创建了一个property类的对象,用这个对象来操作属性,写法:方法名 = property(方法名),写在最后
class Account(object):
"""
还是上面的代码
不再复述
xxx
xxx
xxx
"""
# 使用 property 类来为属性设置便利的访问方式
name = property(get_name)
balance = property(get_balance, set_balance)
# 通过 property 类实例对象以后,在使用对象中的属性时,
# 就可以像使用普通公有属性一样来调用,但是实际调用的还是 set/get 方法。
gy = Account('丽丽', 10)
print(gy.name)
gy.balance = 9999000
print(gy.balance)
@property
@property:在装饰时,写在函数定义的上一行,而且函数定义时set/get方法不需要再加set和get,直接写方法名,举例装饰get name时:
@property
# 这里没有写get_name,而是直接写了name
def name(self):
需要注意的是在装饰set时,使用格式为@xxx.setter ,xxx要和获取方法名(也不用写set)保持一致,如装饰设置set money时:
@money.setter
def money(self, money):
property是类,@property是装饰器,但都是为属性提供便利的操作方式。