# 封装 就是将东西装在类里面 如这里的 变量和方法
# 然后 将口袋封起来 并在封的时候 留一些接口(定义一些函数或者方法)来给外部使用
# 但是问题是 如何拿捏封装的度 才是最重要的 不然到时别人来用你的变量或者方法 你又要开口子
# 这样的你的代码就有很多口子 封装也就失去了意义
# 装饰器也不能解决这样的问题
class Room:
_room_name = "卫生间"
__local = "天安门"
def __init__(self,owner,wildth,highth,lenth):
self.owner = owner
self.__wildth = wildth
self.__highth = highth
self.__lenth = lenth
def get_area(self):
""""#这就是为私有变量开一个口子 或者叫接口 或者叫方法"""
print("%s 住在 %s的%s,面积为%s"
%(self.owner,self.__local,
self._room_name,
self.__wildth*self.__lenth))
room1 = Room("BOYI",13,22,11)
print(room1.__dict__)
# {'owner': 'BOYI', '_Room__wildth': 13, '_Room__highth': 22, '_Room__lenth': 11}
#可以看出 这里的属性字典中
#类中 双下划线的变量 都被修改为 单下划线 加上类名 再是双下划线的变量
print(Room.__dict__)
#{'__module__': '__main__', '_room_name': '卫生间', '_Room__local': '天安门', '__init__': <function Room.__init__ at 0x0000000002717B70>, 'get_area': <function Room.get_area at 0x0000000002717AE8>, '__dict__': <attribute '__dict__' of 'Room' objects>, '__weakref__': <attribute '__weakref__' of 'Room' objects>, '__doc__': None}
#这里的类的属性字典 我们也可以看到 双下划线变量被修改
#'_room_name': '卫生间', '_Room__local': '天安门',
#1、但是像这样双下划线 定义的变量 如何访问呢 可以这样
print(room1._Room__local) #天安门
#2、或者在类里面开一个窗口,接口,其实就是定义一个方法,我们来调用,如下:
room1.get_area()
# BOYI 住在 天安门的卫生间,面积为143