1. 类的封装
1.1 实例方法来实现共同的需求(业务) --实例方法的封装
1-类中实例方法的封装'''
# 案例需求:
# 小明体重75.0公斤,每次跑步会减肥0.5公斤,每次吃东西体重会增加1公斤
# 小美的体重是45.0公斤,每次跑步会减肥0.5公斤,每次吃东西体重会增加1公斤
# 解题的思路
'''类(类名,属性,方法)
类名:Person
属性:
姓名-name
体重-weight
功能:
跑步-run()
吃东西-eat()
class Person():
def __init__(self,name,weight):
self.name = name
self.weight = weight
print('姓名:{},体重:{}'.format(self.name,self.weight))
def run(self):
self.weight -= 0.5
print('姓名:{},跑步后,体重:{}'.format(self.name,self.weight))
def eat(self):
self.weight += 1
print('姓名:{},吃东西后,体重:{}'.format(self.name, self.weight))
# 对象
xiaoming = Person('小明',75)
xiaomei = Person('小美',45)
xiaoming.run()
xiaomei.eat()
1.2 类中私有属性的封装
访问接口一般是由set()/get()方法来表示,
get()方法是提供接口的访问通道,
而set()方法是提供接口的修改通道。
# 案例需求:设计一个银行类,类中有姓名和金额,为了隐藏细节,不能让用户随便修改金额;
# 如果确实要修改金额,则要提供访问访问接口,然后还要避免在操作类的 对象过程中的误操作,
# 比如修改金额传入非法数据,为了保证数据的有效性,要对传入的数据进行判断。
# 解题的思路
类(类名,属性,方法)
类名:Bank
属性:
姓名 - name
金额 - money
功能:
查询 - check()
取钱 -
存钱 -
..
class Bank():
def __init__(self,name,money):
self.name = name
self.__money = money
print('姓名:{},余额:{}'.format(self.name,self.__money))
# 给外部访问提供一个接口
def get_money(self):
# 查询余额
# return self.__money
print('当前余额{}'.format(self.__money))
def set_money(self,m):
# m是否是一个数值;m>0 存钱的操作 m<0 取钱的操作 m=0 不做操作
# 取钱
if isinstance(m,int) or isinstance(m,float):
if m > 0:
self.__money += m
print('存钱操作,存钱后余额:{}'.format(self.__money))
elif m < 0 :
if (abs(m) <= self.__money):
self.__money -= abs(m)
print('取钱操作,取钱后余额:{}'.format(self.__money))
else:
print('余额不足,无法操作~~')
else:
print('输入金额为0,不做任何操作~~')
else:
print('非法操作,请重新输入~~')
zs = Bank('zs',1000)
zs.get_money()
zs.set_money(100)
zs.set_money(-2000)
# 问题:改变了我们调用的方式
# zs.__money --》 zs.get_money()
# zs.__money = 新值 --》 zs.set_money(100)
# 既要有访问和修改的权限,又不要不改变调用的方式
zs.money
zs.money = 100
1.3 使用装饰器@property(属性方法) 私有属性的封装
使用装饰器@property(属性方法) 私有属性的封装
封装属性时,装饰器的使用
装饰器写在get_xxx()函数名的上一行,在get_xxx()函数命名直接以属性名来命名,不需要加上set/get。
在get方法加上@property,方法名与私有属性名一致
在set方法上方加上@xxx.setter,方法名与私有属性名一致,其中xxx与方法名一致
使用装饰器的方法调用
查看:对象名.方法名
修改:对象名.方法名=新值
# 案例需求:设计一个银行类,类中有姓名和金额,为了隐藏细节,不能让用户随便修改金额;
# 如果确实要修改金额,则要提供访问访问接口,然后还要避免在操作类的 对象过程中的误操作,
# 比如修改金额传入非法数据,为了保证数据的有效性,要对传入的数据进行判断。
class Bank():
def __init__(self,name,money):
self.name = name
self.__money = money
print('姓名:{},余额:{}'.format(self.name,self.__money))
# 给外部访问提供一个接口
@property
def money(self): #方法名与属性名一致,但是不要加两个下划线
# 查询余额
# return self.__money
print('当前余额{}'.format(self.__money))
@money.setter
def money(self,m): #方法名与属性名一致,但是不要加两个下划线
# m是否是一个数值;m>0 存钱的操作 m<0 取钱的操作 m=0 不做操作
# 取钱
if isinstance(m,int) or isinstance(m,float):
if m > 0:
self.__money += m
print('存钱操作,存钱后余额:{}'.format(self.__money))
elif m < 0 :
if (abs(m) <= self.__money):
self.__money -= abs(m)
print('取钱操作,取钱后余额:{}'.format(self.__money))
else:
print('余额不足,无法操作~~')
else:
print('输入金额为0,不做任何操作~~')
else:
print('非法操作,请重新输入~~')
zs = Bank('zs',1000)
zs.money
zs.money = 100
zs.money = -500