封装
不同对象共有的方法可以通过函数封装的形式来达到代码复用的作用
"""示例1
小明体重75公斤,跑步一次减重1公斤,吃饭一次增重0.5公斤
小红体重45公斤,跑步一次减重1公斤,吃饭一次增重0.5公斤
"""
class Demo1():
def __init__(self, name, weight):
self.weight = weight
self.name = name
def run(self):
self.weight -= 1
return self.weight
def eat(self):
self.weight += 0.5
return self.weight
xioahong = Demo1('xioahong',45)
print("吃饭之后的体重:",xioahong.eat())
print("跑步之后的体重",xioahong.run())
xiaoming = Demo1('xioaming',75)
print("吃饭之后的体重:",xiaoming.eat())
print("跑步之后的体重:",xiaoming.run())
'''示例2
编写一个学生类,有姓名、性别、年龄、语数英三个成绩,求总分、平均分以及打印学生的信息
类名:Students
属性:姓名、性别、年龄、语数英三个成绩
方法:总分、平均分以及打印学生的信息
'''
class Students():
def __init__(self, name, sex, age, Mscore, Cscore, Escore):
self.name = name
self.age = age
self.sex = sex
self.Mscore = Mscore
self.Cscore = Cscore
self.Escore = Escore
def avg(self):
avgScore = 0
avgScore = (self.Cscore + self.Mscore + self.Escore) / 3
return avgScore
def sum(self):
sum = 0
sum = self.Cscore + self.Mscore + self.Escore
return sum
def info(self):
return ('''学生姓名:{},性别:{},年龄:{},总分:{}平均分:{}'''.format(self.name,self.sex,self.age,self.sum(),self.avg()))
zs = Students('zs','man',19,80,90,100)
print("总分:",zs.sum())
print("平均分:",zs.avg())
print(zs.info())
私有属性的封装
私有属性的封装 - get set
私有属性在类外边无法访问,虽然保证了数据的安全性,但是也带来了不便
属性的封装:可以在保证数据的安全性的同时也提供了访问的接口。
# 方法1:get set
# 示例 银行账户取钱
class Account():
def __init__(self, name, money):
self.__name = name
self.__money = money
def get_money(self):
return self.__money
def set_money(self, m):
if isinstance(m,int) or isinstance(m,float):
if 0 < m <= self.__money:
self.__money -= m
print("余额:",self.__money)
else:
print("余额不足")
else:
print("输入的取款值不合法")
return self.__money
accout1 = Account('zs',1000)
print(accout1.get_money())
print(accout1.set_money(300))
私有属性的封装 - 装饰器
@property:在装饰时,写在函数定义的上一行,而且函数定义时set/get方法不需要再加上set和get,直接写方法名
get方法:在函数上方加上@property,方法名不需要get
set方法:在函数上方加上@xxx.setter,方法名不需要set,其中xxx与方法名一致
调用:用@property装饰器装饰的方法,就相当于把方法变成了类的一个属性,属性名即方法名,属性名不可以重复,使用和复制就跟类中属性的操作一致
查看:对象.方法名
赋值:对象.方法名 = 新值
# 方法2: 装饰器
# 示例 银行账户取钱
class Account1():
def __init__(self, name, money):
self.__name = name
self.__money = money
@property
def money(self): # 函数名和属性名保持一致
return self.__money
@money.setter
def money(self, m): # 函数名和属性名保持一致
if isinstance(m,int) or isinstance(m,float):
if 0 < m <= self.__money:
self.__money -= m
print("余额:",self.__money)
else:
print("余额不足")
else:
print("输入的取款值不合法")
return self.__money
zs = Account1('zs',300)
print(zs.money)
zs.money = 100 # 取款100元