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 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)
stu1 = Student("rose",20,"man","111111111111111111")
# 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)
# stu1.set_id_crad(123)
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 __user_auth(self):
        print("请输入账号密码....")
    def __input_money(self):
        print("余额为100000000,请输入取款金额!")
    def  __save_record(self):
        print("记录流水....")
atm = ATM()
# atm.user_auth()
# atm.input_money()
# atm.save_record()
# atm.withdraw()
# atm.save_record()
 
封装的原理
python是通过 变形的方式来实现的封装
如何变形 在名称带有双下划线开头的变量名字前添加_类名  如_Person__id_card
当然通过变形后的名字可以直接访问被隐藏的属性  但通常不应该这么做
变形仅在类的定义阶段发生一次 后续再添加的带有双下划线的任何属性都不会变形  就是普通属性
 
class Person:
    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
p = Person("rose",20,"321123123123123123")
print(p.name)

# p.__id_card = "321"
# print(p.__dict__)
# print(p._Person__id_card)
p.__gender = "man"
print(p.__dict__)
 
                             @property
将访问私有属性和普通属性方式变一致,将一个方法伪装成属性
class Teacher:
    def __init__(self,name,age,salary):
        self.name = name
        self.age = age
        self.__salary = salary
    @property  # getter   # 用于访问私有属性的值   也可以访问普通属性
    def salary(self):
        return self.__salary
    @salary.setter   # 用来设置私有属性的值  也可以设置普通属性
    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
    #通常property 用于操作私有的属性
t = Teacher("egon",38,100000)
#
# print(t.get_salary())
#
# t.set_salary(5000)
#
# print(t.get_salary())
# print(t.name)
# 被封装的属性在访问时  需要调用方法  而普通属性直接点就ok 这样一来对于对象的使用者而言
# 必须知道要访问的属性 是私有的还是公开 然后调用对于的方法    用起来麻烦
# 此时  我们的目标是 让访问私有属性 和访问普通属性的方式一致
#被封装的内容不可被继承
 
                          多态
多个不同类型的对象,可相迎同一方法,并且产生不同结果。
只需学习基类中的使用方法即可,不需关心具体的类及实现方法。
 
 
 

   

 

posted @ 2019-05-20 21:51  呼吸决定丶  阅读(102)  评论(0)    收藏  举报