封装就是使用特殊的语法,对成员属性和成员方法进行包装,达到保护和隐藏的目的
但是一定注意,不能把成员全部封装死,就失去意义了
被封装的成员主要是供类的内部使用
被特殊语法封装的成员,会有不同的访问的权限
封装的级别
成员 ==> 公有的
_成员 ==> 受保护的 (约定俗成,而python没有具体实现)
__成员 ==> 私有的
公有的 public 受保护的 protected 私有的 private
在类的内部 OK OK OK
在类的外部 OK No(python可以) No
了解即可:
在python中给成员进行私有化,其实就是改了成员的名字
私有化 ==> _类名__成员
class Person():
# 成员属性
name = None
_sex = None # 在成员前面 加一个 _ 受保护的成员
__age = None # 在成员前面 加两个 __ 私有的成员
# 初始化方法
def __init__(self,a,b,c):
self.name = a
self._sex = b
self.__age = c
def _say(self):
print('hello,world!')
def __sing(self):
print('lets together')
def func(self):
# 在类的内部可以操作任意成员
print(self.__age)
def __del__(self):
print('its over')
jd = Person('jd','Girl',23,)
#属性调用:
# print(jd._sex) # 输出:Girl
# 在类的外部不能操作 受保护的成员 (但是Python中可以)
# print(jd.__age) # 输出报错:AttributeError: 'Person' object has no attribute '__age'
# 在类的外部不能操作 私有成员属性
# print(jd._Person__age) # 输出:23
# 可以使用特殊的语法获取私有成员
#函数调用:
# jd._say() # 输出:hello,world! (_和__方法和调用属性方法是一致的)
# jd.__sing() # 输出报错:AttributeError: 'Person' object has no attribute '__sing'
jd.func() # 输出:可以通过内部调用来调用私有成员属性
# print(jd.__dict__) #获取当前对象的所有属性,如果将__init__注销,则返回一个空集合
# print(Person.__dict__)#可以获取当前类所有成员信息 输出: