面向对象三大特性之封装

面向对象三大特性之封装

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
posted @ 2019-11-27 21:03  Mr沈  阅读(161)  评论(0编辑  收藏  举报