python之路---面向对象之封装

什么是封装
# 封:属性是对外隐藏,对内开放的(在类的内部可以直接访问,类的外部无法直接访问)
# 装:申请一个名称空间,往里面装入一系列的属性/名字

# class People:
#     __country = 'china'    #变形为_People__country
#     def __init__(self,name,age,sex):
#         self.__name = name
#         self.age  = age
#         self.sex  = sex
#     def func(self):
#         print('say hello')
#         print(People.__country)
#         print(self.__name)
#
# print(People.country)
# s = People('bob',23,'male')
# print(People.__dict__)

 隐藏属性的底层原理

# 在属性前加__开头实现隐藏(这种隐藏仅仅是语法上的变形操作)

# 这种变形只在类定义阶段(检测语法时)发生一次(因为类体代码仅仅在定义阶段接检测一次)
# 这种隐藏是对外不对内的,即在类的内部可以直接访问,而类的外部无法直接访问,原因是:
# 在定义阶段,类体代码统一发生了一次变形

# class Foo:
#     def f1(self):
#         print('from foo_f1')
#     def f2(self):
#         print('from foo_f2')
#         self.f1()
#
# class Bar(Foo):
#     def __f1(self):
#         print('from bar_f1')
#
# obj = Bar()
# obj.f2()

封装的意义

# 封装属性的意义:
# 首先定义属性的目的就是给类外部的使用者使用的,隐藏的目的是为了不让外部使用者直接使用,需要类内部开辟一个接口
# 封装数据属性:
# 使外部的使用者通过接口间接的操作被隐藏的属性,精髓在于,我们可以在接口上附加任何逻辑,从而严格的控制使用者对属性的操作
# 封装函数属性:在接口内间接的调用功能,精髓在于隔离了复杂度

#通过封装数据属性来严格控制对象修改
class People:
    def __init__(self,name,age):
        self.__name = name
        self.__age  = age

    def info_see(self):
        print('姓名:%s\t年龄:%s'%(self.__name,self.__age))

    def set(self,name,age):
        if not isinstance(name,str):
            raise TypeError('用户名必须是字符串!!!')
        if not isinstance(age,int):
            raise TypeError('年龄必须是纯数字!!!')
        self.__name = name
        self.__age  = age

tony = People('小马哥',25)
tony.set('小马哥',23)
tony.info_see()
#通过对函数属性的封装来隔离复杂度
'''
对于取钱这个操作,可以划分为:插卡,输用户名和密码,输入金额,打印凭条,退卡等...
'''
import time
class Atm:
    def __card(self):
        print('正在插卡...')
        time.sleep(1)
    def __pwd(self):
        print('正在输入用户信息...')
        time.sleep(1)
    def __money(self):
        print('正在输入金额...')
        time.sleep(1)
    def __printt(self):
        print('正在打印凭证...')
        time.sleep(1)
    def __exit_os(self):
        print('正在退出...')
    def withdraw(self):   #进行封装
        self.__card()
        self.__pwd()
        self.__money()
        self.__printt()
        self.__exit_os()

p = Atm()
p.withdraw()

猜你喜欢

转载自blog.csdn.net/ltfdsy/article/details/81908549
今日推荐