封装简介
#什么是封装 对外部隐藏实现细节,并且提供简单的接口 #封装的目的 1、提高安全性(封装数据) 2、隔离复杂度(封装方法) #如何封装 使用特殊语法,给要隐藏的变量前加双下划线(__)
隐藏数据
#其实这仅仅这是一种变形操作且仅仅只在类定义阶段发生变形 #类中所有双下划线开头的名称如__x都会在类定义时自动变形成:_类名__x的形式: class A: __N=0 #类的数据属性就应该是共享的,但是语法上是可以把类的数据属性设置成私有的如__N,会变形为_A__N def __init__(self): self.__X=10 #变形为self._A__X def __foo(self): #变形为_A__foo print('from A') def bar(self): self.__foo() #只有在类内部才可以通过__foo的形式访问到. #A._A__N是可以访问到的, #这种,在外部是无法通过__x这个名字访问到。
property装饰器
#为什么要用property 对象再去使用的时候obj.name,根本无法察觉自己的name是执行了一个函数然后计算出来的, 为了统一私有属性和普通属性的访问方式,使用property将类内的函数属性伪装成数据属性
class People: def __init__(self,name,weight,height): self.name=name self.weight=weight self.height=height # @property def bmi(self): return self.weight / (self.height**2) p1=People('egon',75,1.85) print(p1.bmi()) 此时需要p1.bmi()调用 如果用@property,可以直接p1.bmi调用