面向对象三大特性之封装
面向对象三大特性之封装
1、什么是封装
封装指的是将一堆属性和方法封装到对象中
对象:好比一个袋子或容器,可以存放一堆属性和方法
2、为什么要用封装
可以通过 “ 对象. ” 的方式存取属性或方法
对象拥有 “.” 的机制,方便数据的存取
3、如何封装
通过类来进行封装
class Foo:
x = 10
def func(self):
print('方法')
t = Foo()
print(t.x) # 10
# 添加属性
t.y = 20
print(t.y) # 20
t.func() # 方法
4、访问限制机制(隐藏属性和方法)
凡是类的内部定义的属性或方法以__开头的属性或方法名,都会被限制访问,外部不能“直接”访问该属性原型,内部可以访问
作用:将一些隐私的数据隐藏起来,不让外部轻易获取,可以通过接口将一堆数据封装成一个接口,让用户通过接口进行一系列逻辑判断最后将数据返回给用户。
类里要定义了以__开头的要想访问可以通过以下方式访问:
_类名__属性或方法名
class Info:
def __init__(self, name, age, ID):
self.name = name
self.__age = age # 本质是_Info__age
self.__ID = ID # 本质是_Info__ID
def paser_user(self,username,pwd):
if username == 'shen' and pwd == '123':
print(f'{self.name}, {self.__age}, {self.__ID}')
else:
print('无权限访问')
fun = Info('shen',18,3239027328)
fun.paser_user('shen','123') # shen, 18, 3239027328
# 没有__开头的可以直接访问
print(fun.name) # shen
# 类内部有__开头的无法直接访问
# print(fun.__age) # AttributeError: 'Info' object has no attribute '__age'
# 可以通过_类名__属性名获取
print(fun._Info__age) # 18
class ATM:
def __inster(self):
print('插卡')
def __pwd(self):
print('输入密码')
def __choice_money(self):
print('取款金额')
def __check_flow(self):
print('查看流水')
def withdraw(self):
self.__inster()
self.__pwd()
self.__choice_money()
self.__check_flow()
st = ATM()
# 外部不能直接访问内部__开头的方法,可以通过封装成一个接口访问返回数据
st.withdraw()
# 插卡
# 输入密码
# 取款金额
# 查看流水
5、property
property是python内置的一个装饰器,可以装饰 “ 在类内部的方法 ” 之上将方法的调用方式由对象.方法()——>对象.方法
1、可以将类中的函数 “ 伪装成 ” 对象的数据属性
2、让名词的方法调用时更为合理
class BIM:
def __init__(self,name,height, weight):
self.name = name
self.height = height
self.weigiht = weight
# 在函数上面写
@property
def get_bim(self):
print(f'{self.name}的bim是: {self.weigiht / (self.height**2)}')
bim_obj = BIM('沈', 1.8, 61)
bim_obj.get_bim # 沈的bim是: 18.827160493827158