广义上的面向对象的封装:
代码的保护,面向对象思想本身就是一种封装
只让自己的对象调用自己类的方法
狭义的封装:
面向对象的三大特性之一,其他两个是继承和多态。
属性和方法都可以藏起来不让你看到
1 class Person :
2 __key = 123 # 私有静态属性
3
4 def __init__(self,name,passwd):
5 self.name = name
6 self.__passwd = passwd # 加__变成私有属性
7
8 def get_pwd(self):
9 print(self.__dict__)
10 return self.__passwd
11
12 def __get_pwd1(self): # 定义私有方法
13 print(self.__dict__)
14 return self.__passwd
15
16 def login(self):
17 self.__get_pwd1()
18
19 yangtuo = Person("yangtuo","tiancai")
20 # print(alex.__passwd) # 私有属性在外面是调不到的
21 # AttributeError: 'Person' object has no attribute '__passwd'
22 print(yangtuo.__dict__) # 私有属性仅仅是代码级别的一小层的加密
23 print(yangtuo._Person__passwd) # 通过一定的方法依然可以在外部调用私有属性,但是请不要用这种方式
24 print(yangtuo.get_pwd()) # 通过类内的函数方法还是可以调用出来的
25
26
27 yangtuo.__higt = 1 # 在类的外部这样创建是没用的,是无法成为私有属性的,哪怕你加了下划线
28 print(yangtuo.get_pwd())
29 print(yangtuo.__higt) # 因此可以在外部调用,毕竟不是私有属性嘛
私有属性或者方法都是左边加双下划线,而且只能在内部使用,不能在外部使用
可以定义私有的有
对象的私有属性
类中的静态属性
类中的方法
虽然你知道可以用什么方法在外部使用,但是别做就行了
顺便在其他语言里面 分为 public protect private
python 只有 public 和 private,用没有下划线和前面加双下划线表示区分,不需要关键字
会用到私有概念的场景
隐藏属性不被外部调用
保护属性不被随便改
保护属性不被子类继承