python学习之-类的封装

1. 什么是封装
装:将属性装到一个容器里,该容器可以是类也可以是对象

封:指的是将装到容器里的对象给隐藏起来,该隐藏是对外不对内的

2. 为何要封装

隐藏数据属性的目的

把数据属性隐藏起来,是为了外使用者不能直接操作属性,而是通过类内部开辟的接口来间接地操作属性 我们可以在接口之上附加任意的控制逻辑,从而严格控制使用者对属性的操作

隐藏函数属性的目的:

3. 如何封装
在属性前加 __前缀

封装实例

class Foo:
__x=1 #这里就是封装
def __init__(self,name,age):
self.__name=name #这里是封装
self.__age=age #这里是封装

def tell_info(self): #这里定义一个函数用来查看类体内的封装
print(self.__name,self.__age,self.__x,Foo.__x)

print(Foo.__x) #这时候已经访问不到x这个值,外部访问已经查找不到
obj=Foo('egon',18)
print(obj.__name,obj.__age) #这里对象也访问不到,外部访问已经查找不到
print(obj.__dict__)
PS:原理就是类的静态函数、类函数、普通函数、全局变量以及一些内置的属性都是放在类__dict__里的,生成一个key:value的字典,然后在代码执行时候就会以key查找
但凡__开头的属性,在类定义的时候,就会在字典里加上__开头存入
obj.tell_info() #类内的函数可以访问到
# print(Foo._Foo__x)#通过这样的方式就可以访问到,所以不是绝对隐藏
# print(obj._Foo__name)

注意:
1. __开头属性会在类定义阶段检测语法时发生变形,变形规则: _类名__属性名
2. 类定义阶段之后新增的__开头的属性不会变形
3. 在继承中,父类如果不想让子类覆盖自己的方法,可以将方法定义为隐藏的

扫描二维码关注公众号,回复: 4438902 查看本文章
class Foo:
__x = 1 #这里在定义的时候就发生了变形

def __init__(self, name, age):
self.__name = name #这里在定义的时候就发生了变形
self.__age = age #这里在定义的时候就发生了变形

def tell_info(self):
print(self.__name) #这里在定义的时候就发生了变形

obj=Foo('egon',18)

obj.__yyy=111 #类定义之后新增不会发生变形
print(obj.__dict__) #查看下有没有变形
print(obj.__yyy) #这里可以直接访问到



class Foo:
def __f1(self): #在类定义阶段变形成Foo__f1
print('Foo.f1')

def f2(self):
print('Foo.f2')#在类定义阶段变形成Foo__f2
self.__f1() #这里调用自己,不会和Bar里面的f1冲突

class Bar(Foo):
def __f1(self): #在定义阶段变形成Bar__f1
print('Bar.f1')

obj=Bar()
obj.f2()

PS:想访问的方法就是访问自己,把方法变成赢藏的,然后在一个地方调用,一定不会和别的同名的冲突,为什么不会冲突,因为在类定义阶段大家都统一进行了变形,变形规则就是自己的类名,所以和别人冲突不了,类名是不会重复的

猜你喜欢

转载自www.cnblogs.com/shizhengquan/p/10093374.html