day26
封装
定义
对外部隐藏内部属性以及实现细节,给外部提供使用接口
作用
1.提高安全性(封属性)
2.隔离复杂度(封方法)
封属性:
class Student:
def __init__(self,name,age,gender,id_card):
self.name = name
self.age = age
self.gender = gender
self.__id_card = id_card
def __init__(self,name,age,gender,id_card):
self.name = name
self.age = age
self.gender = gender
self.__id_card = id_card
# 访问器
def get_id_card(self,pwd):
# 可以在这里添加额外的任何逻辑代码 来限制外部的访问
# 在类的内部 可以访问
if pwd =="123":
return self.__id_card
raise Exception("密码错误!")
# 修改被封装的属性 称之为设置器
def set_id_crad(self,new_id):
# 身份证必须是字符串类型
# 长度必须是18位
if isinstance(new_id,str) and len(new_id) == 18:
self.__id_card = new_id
else:
raise Exception("身份证号码 必须是字符串 且长度必须为18!")
# stu1 = Student("rose",20,"man","111111111111111111")
#
# print(stu1.name)
# print(stu1.id_card)
# stu1.id_card = "123"
# print(stu1.id_card)
#
# print(stu1.name)
# print(stu1.id_card)
# stu1.id_card = "123"
# print(stu1.id_card)
stu1 = Student("rose",20,"man","111111111111111111")
# print(stu1.id_card)
# print(stu1.__id_card)
# stu1.show_id_card()
# stu1.set_id_crad("222222222222222222")
# print(stu1.id_card)
# print(stu1.__id_card)
# stu1.show_id_card()
# stu1.set_id_crad("222222222222222222")
# stu1.show_id_card()
# id = stu1.get_id_card()
# print(id)
# print(id)
# stu1.set_id_crad(123)
stu1.set_id_crad("555555555555555555")
# print(stu1.get_id_card())
stu1.set_id_crad("555555555555555555")
# print(stu1.get_id_card())
print(stu1.get_id_card("1232"))
封装方法:
class ATM:
def withdraw(self):
# 输入账号和密码
self.__user_auth()
# 显示余额 输入取款金额
self.__input_money()
# 保存记录
self.__save_record()
def withdraw(self):
# 输入账号和密码
self.__user_auth()
# 显示余额 输入取款金额
self.__input_money()
# 保存记录
self.__save_record()
def __user_auth(self):
print("请输入账号密码....")
def __input_money(self):
print("余额为100000000,请输入取款金额!")
print("余额为100000000,请输入取款金额!")
def __save_record(self):
print("记录流水....")
print("记录流水....")
atm = ATM()
# atm.user_auth()
# atm.input_money()
# atm.save_record()
# atm.user_auth()
# atm.input_money()
# atm.save_record()
# atm.withdraw()
# atm.save_record()
封装的原理
python是通过 变形的方式来实现的封装
如何变形 在名称带有双下划线开头的变量名字前添加_类名 如_Person__id_card
当然通过变形后的名字可以直接访问被隐藏的属性 但通常不应该这么做
如何变形 在名称带有双下划线开头的变量名字前添加_类名 如_Person__id_card
当然通过变形后的名字可以直接访问被隐藏的属性 但通常不应该这么做
变形仅在类的定义阶段发生一次 后续再添加的带有双下划线的任何属性都不会变形 就是普通属性
class Person:
def __init__(self,name,age,id_card):
self.name = name
self.age = age
self.__id_card = id_card
def __init__(self,name,age,id_card):
self.name = name
self.age = age
self.__id_card = id_card
def get_id_card(self):
return self.__id_card
return self.__id_card
p = Person("rose",20,"321123123123123123")
print(p.name)
print(p.name)
# p.__id_card = "321"
# print(p.__dict__)
# print(p._Person__id_card)
p.__gender = "man"
p.__gender = "man"
print(p.__dict__)
@property
将访问私有属性和普通属性方式变一致,将一个方法伪装成属性
class Teacher:
def __init__(self,name,age,salary):
self.name = name
self.age = age
self.__salary = salary
def __init__(self,name,age,salary):
self.name = name
self.age = age
self.__salary = salary
@property # getter # 用于访问私有属性的值 也可以访问普通属性
def salary(self):
return self.__salary
def salary(self):
return self.__salary
@salary.setter # 用来设置私有属性的值 也可以设置普通属性
def salary(self,new_salary):
self.__salary = new_salary
def salary(self,new_salary):
self.__salary = new_salary
@salary.deleter # 用来设置私有属性的值 也可以删除普通属性
def salary(self):
# print("can not delete salary!")
del self.__dict__["_Teacher__salary"]
# del self.__salary
def salary(self):
# print("can not delete salary!")
del self.__dict__["_Teacher__salary"]
# del self.__salary
#通常property 用于操作私有的属性
t = Teacher("egon",38,100000)
#
# print(t.get_salary())
#
# t.set_salary(5000)
#
# print(t.get_salary())
# print(t.name)
t = Teacher("egon",38,100000)
#
# print(t.get_salary())
#
# t.set_salary(5000)
#
# print(t.get_salary())
# print(t.name)
# 被封装的属性在访问时 需要调用方法 而普通属性直接点就ok 这样一来对于对象的使用者而言
# 必须知道要访问的属性 是私有的还是公开 然后调用对于的方法 用起来麻烦
# 此时 我们的目标是 让访问私有属性 和访问普通属性的方式一致
# 必须知道要访问的属性 是私有的还是公开 然后调用对于的方法 用起来麻烦
# 此时 我们的目标是 让访问私有属性 和访问普通属性的方式一致
#被封装的内容不可被继承
多态
多个不同类型的对象,可相迎同一方法,并且产生不同结果。
只需学习基类中的使用方法即可,不需关心具体的类及实现方法。

浙公网安备 33010602011771号