#在python中用双下划线开头的方式将属性隐藏起来(设置成私有的
'''
类中私有的,只有类内部使用,外部无法访问
封装的真谛在于明确地区分内外,封装的属性可以直接在内部使用,
而不能被外部直接使用,然而定义属性的目的终归是要用,
外部要想用类隐藏的属性,需要我们为其开辟接口,
让外部能够间接地用到我们隐藏起来的属性
'''
# class A:
# def fa(self):
# print('from A')
# def test(self):
# self.fa()
# class B(A):
# def fa(self):
# print('from B')
# b=B()
# b.test()
#在继承中,父类如果不想让子类覆盖自己的方法,可以将方法定义为私有的
# class A:
# __x =10 #以单划线开头的就是被隐藏起来,如果以双划线开头则外部调用不可调用
# def __fa(self):#在定义时就变形为_A__fa
# print('from A')
# def test(self):
# self.__fa()#只会与自己所在的类为准,即调用_A__fa
# class B(A):
# def __fa(self):
# print('from B')
#
# b=B()
# # print(A.__dict__)# '_A__x': 10, 所有要想访问到 __x 需要输入的是print(_A__x)
# print(b._A__x) #10
# b.test()
'''
1:封装数据:将数据隐藏起来这不是目的。隐藏起来然后对外提供操作该数据的接口,然后我们可以在接口附加上对该数据操作的限制,以此完成对数据属性操作的严格控制。
'''
# class Teacher:
# def __init__(self,name,age):
# # self.__name=name
# # self.__age=age
# self.set_info(name,age)
#
# def tell_info(self):
# print('姓名:%s,年龄:%s' %(self.__name,self.__age))
# def set_info(self,name,age): # 既然外部不可以使用,但是内部可以调用,所以写这个函数就是对外开放个接口,让外部去访问
# if not isinstance(name,str):
# raise TypeError('姓名必须是字符串类型')
# if not isinstance(age,int):
# raise TypeError('年龄必须是整型')
# self.__name=name
# self.__age=age
#
#
# t=Teacher('egon',18)
# t.tell_info()
#
# t.set_info('egon',19)
# t.tell_info()
'''
2:封装方法:目的是隔离复杂度
#取款是功能,而这个功能有很多功能组成:插卡、密码认证、输入金额、打印账单、取钱
#对使用者来说,只需要知道取款这个功能即可,其余功能我们都可以隐藏起来,很明显这么做
#隔离了复杂度,同时也提升了安全性
'''
class ATM:
def __card(self):
print('插卡')
def __auth(self):
print('用户认证')
def __input(self):
print('输入取款金额')
def __print_bill(self):
print('打印账单')
def __take_money(self):
print('取款')
def withdraw(self):
self.__card()
self.__auth()
self.__input()
self.__print_bill()
self.__take_money()
a=ATM()
a.withdraw()