类中属性和方法的访问限制机制

类中属性和方法的访问限制机制

1、什么是访问限制机制

  凡是在类内部定义的属性或方法,以__开头的属性或者方法名,都会被限制,外部不能 "直接访问" 该属性原型(这是python特有的)

  PS:看起来就像是将该属性或方法隐藏起来了

 

  注意:凡是在类内部定义__开头的属性或方法,都会变形为:_类名__属性/方法,可以通过 "对象._类名__属性/方法" 调用

 

2、为什么要使用访问限制机制

  可以将一些隐私的数据,隐藏起来,不让外部轻易获取

  应用场景:

    可以将一些数据封装成一个接口,可以让用户调用接口,并且通过相应的逻辑判断或者校验,最后再将数据返回给用户

 

3、例:访问限制机制

  例1:使用访问机制 取数据

class Animal:
    # __开头的属性
    __name = "pig"    # __name变形为 _类名__name
    # __开头的方法
    def __run(self):
        print("pig is running...")

# 直接访问
# print(Animal.__name)    # 报错:AttributeError: type object 'Animal' has no attribute '__name'

obj = Animal()
# 对象._类名__name
print(obj._Animal__name)
obj._Animal__run()

  执行结果:

pig
pig is running...

 

  例2:通过校验返回用户信息(用户信息为隐私数据)

class Animal:
    __name = "pig"
    __age = 18
    __sex = "female"
    __ID = "418412194502301548"

    # def __init__(self, name, age, sex):
    #     self.__name = name
    #     self.__age = age
    #     self.__sex = sex

    def parse_user(self, username, password):
        if username == "pig" and password == "123":
            print(f"""
            通过验证,获取到用户数据:
            姓名:{self.__name}
            年龄:{self.__age}
            性别:{self.__sex}
            身份ID:{self.__ID}
            """)
        else:
            print("校验失败,无法查询用户信息")

    # __开头的方法
    def __run(self):
        print("pig is running...")


username = input("请输入账号:").strip()
password = input("请输入密码:").strip()
obj = Animal()
obj.parse_user(username, password)

  执行结果:

# 正确结果

请输入账号:pig
请输入密码:123

            通过验证,获取到用户数据:
            姓名:pig
            年龄:18
            性别:female
            身份ID:418412194502301548


# 错误结果

请输入账号:pig
请输入密码:123456
校验失败,无法查询用户信息

 

  例3:将ATM取款操作按照顺序封装起来

"""
ATM机取钱:
    1.插卡
    2.输入密码
    3.输入取款金额
    4.出钱
    5.打印流水账单
"""
class ATM:
    # 1.插卡
    def __insert_car(self):
        print("插卡")

    # 2.输入密码
    def __input_put(self):
        print("输入密码")

    # 3.输入取款金额
    def __input_balance(self):
        print("输入金额")

    # 4.出钱
    def __output_money(self):
        print("开始出钱")

    # 5.打印流水账单
    def __print_flow(self):
        print("打印账单")

    # 取款顺序规范接口,按照1-5顺序进行取款操作
    def withdraw(self):
        self.__insert_car()
        self.__input_put()
        self.__input_balance()
        self.__output_money()
        self.__print_flow()


obj = ATM()
obj.withdraw()

  执行结果:

插卡
输入密码
输入金额
开始出钱
打印账单
posted @ 2020-10-26 21:47  chchcharlie、  阅读(343)  评论(0编辑  收藏  举报