10月8日封装
封装
封装是什么意思,如果从封装本身的意思去理解,封装就好像是拿来一个麻袋,把小猫,小狗,小鸟一起装到麻袋,然后把麻袋包起来,按照这个意思,封装='隐藏',这种理解是片面的,组合也是封装的一种
封装的作用是什么
把需要隐藏的数据包起来,隐藏起来,外部就访问不到,只有内部可以访问
隐藏属性:通过 _ _ 方法名来隐藏
目的:将属性隐藏起来这不是目的。隐藏起来方便提供一个统一对外的接口,然后可以在接口附加一些条件和限制
class Person:
def __init__(self,name,age):
self.__name=name
self.age=age
def get_name(self):#这里我生成一个对外的接口
print(self.__name)#这里是打印
return self.__name#这里是返回
man=Person('nick',89)
man.get_name()#这里我用类里面的访问方法访问被隐藏的属性
#print(man.__name)#因为我将name隐藏了外部是访问不到的
上述代码中的看似外部访问不到,实际是有办法的
class Person:
def __init__(self,name,age):
self.__name=name
self.age=age
def get_name(self):
print(self.__name)#这里是打印
return self.__name#这里是返回
man=Person('nick',89)
print(man.__dict__)#这里我以字典的形式输出出来,也反映了隐藏是通过变形隐藏了属性
上述输出能输出被隐藏的属性也说明了python语言的随意性,也说明封装属性是将属性的名字进行了变形
变形是在哪个阶段变得形
class Person:
def __init__(self,name,age):
self.__name=name
self.__age=age
def set_xx(self,xx):
self.__xx=xx
p=Person('nick',18)
p.__xx='xxx'#这里是将外部的__变量名放入到类里面
p.set_xx('8848')#这里是给内部的隐藏变量名进行修改
print(p.__dict__)#结果为{'_Person__name': 'nick', '_Person__age': 18, '__xx': 'xxx', '_Person__xx': '8848'}
从上知道当对象初始化的时候,发生的变化。同时外部放入的 _ _ 变量名属性是不隐藏的,但是如果我在内部添加新的以 _ _ 变量名命名的变量,都会被隐藏
封装函数还有一个特殊的用法可以在继承中,让父类中不想让子类继承的方法改为私有即可
#正常情况,我的子类继承父类的test的方法
class fulei:
def fa(self):
print('来自fulei')
def test(self):
self.fa()
class zilei(fulei):
def fa(self):
print('来自zilei')
zi=zilei()
zi.test()#结果为来自zilei
#当我把父类里面的fa改为私有
class fulei:
def __fa(self):
print('来自fulei')
def test(self):
self.__fa()
class zilei(fulei):
def __fa(self):
print('来自zilei')
zi=zilei()
zi.test()#结果为来自fulei
封装方法
目的是隔离复杂度,提高安全性
class Person:
def __init__(self,name,age):
self.__name=name
self.__age=age
def __speak(self):#在方法名前加__进行隐藏
print('6789')
p=Person('nick',89)
print(Person.__dict__)
p._Person__speak()#这里进行内部访问
上述代码格式讲述了如何封装方法,下面来详细解析封装方法
假设我要去取款,我首先要插卡,再验证密码,再输入需要取款的金额,再打印取款单,最后拿到金额
class ATM:
def __chaka(self):
print('插卡')
def __yanzheng(self):
print('用户验证')
def __jine(self):
print('输入取款金额')
def __zhangdan(self):
print('打印账单')
def __qukuan(self):
print('取款')
def zonghe(self):#这里我生成一个内部调用方法来调用这些被隐藏的方法
self.__chaka()
self.__yanzheng()
self.__jine()
self.__zhangdan()
self.__qukuan()
a=ATM()#生成一个实例对象
a.zonghe()#使用内部的方法来查看被隐藏的方法
上述的代码们到出现了可以调用隐藏方法的函数这些函数被称为接口函数,这与接口的概念还不一样,接口代表一组接口函数的集合体
对于封装方法还有一个例子电视机的开、关机以及大、小声音都需要按钮来操作,而这些按钮就相当于接口,所以封装方法最核心的目的就是我能让原本复杂的功能综合在一起然后通过接口函数来使用。
class TV():#生成一个电视的类
def __kaiji(self):
print('电视开机')
def __pindao(self):
print('频道切换')
def __shengyin(self):
print('声音调大调小')
def __huazhi(self):
print('画质切换')
def __off(self):
print('电视关机')
def yaokongqi(self):#生成一个用来调用的方法
self.__kaiji()
self.__pindao()
self.__shengyin()
self.__huazhi()
self.__off()
tv=TV()
tv.yaokongqi()
小结:1.封装属性和封装方法的核心目的:增强代码的可维护性、可扩展性、和安全性。
2.将数据(属性)和操作数据的方法捆绑在一起。
3.封装的主要目的是将类的内部实现细节隐藏起来,只提供有限的接口(公共方法)供外部使用,从而保护数据的完整性和安全性。