面向对象的三大特性:继承 多态 封装
封装
广义上的
狭义上的:会对一种现象起一个专门属于它的名字
把一对东西装在一个容器里
函数和属性撞到了一个非全局的命名空间 -- 封装
python
pulic 公有的
private 私有的
java完全面向对象的语言
public 共有的
protect 保护的
private 私有的
定义一个私有的名字:就是在私有的名字前面加两天下划线 __N = ‘aaa’
所谓私有,就是不能再累的外面去引用它
class A:__N = 'aaa' # 静态变量def func(self):print(A.__N) # 在类的内部使用正常a = A()
a.func()
print(A.__N) # 在类的外部直接使用 报错class A:__N = 'aaa' # 静态变量def func(self):print(A.__N) # 在类的内部使用正常print(A.__dict__)
print(A._A__N) # python就是把__名字当成私有的语法
一个私有的名字,在存储的过程中仍然会出现A.__dict中,所以我们仍然可以调用
python对其的名字进行了修改:__类名_名字
只不过在类的外部调用:需要‘_类名__名字’去使用
在类的内部可以正常的使用名字
_A__N
在类内 只要你的代码遇到了__名字, 就会被python解释器自动的转换成_类__名字
私有的属性
class B:def __init__(self,name):self.__name = namedef func(self):print('in func : %s'%self.__name)
b = B('alex')
# print(b._B__name)
b.func()私有的方法
class C:def __wahaha(self):print('wahaha')def ADCa(self):self.__wahaha()
c = C()
# c._C__wahaha()
c.ADCa()
在类中,静态属性,方法,对象属性都可以变成是由的,只需要在这些名字之前加上__
# class D:
# def __func(self): # '_D__func'
# print('in func')
#
# class E(D):
# def __init__(self):
# self.__func() # '_E__func'
# e = E()
# 私有的名字不能被子类继承# class D:
# def __init__(self):
# self.__func()
# def __func(self):
# print('in D')
#
# class E(D):
# def __func(self):
# print('in E')
# e = E()
# 私有的名字,在类内使用的时候,就是会变形成_该类名__方法名
# 以此为例 :没有双下换线会先找E中的func
# 但是有了双下划线,会在调用这个名字的类D中直接找_D__func
# class F:
# pass
# F.__name = 'alex' # 不是在创建私有属性
# print(F.__name)
# print(F.__dict__)
# 变形只在类的内部发生
java中的对比
public 共有的 在类的内部可以使用,子类可以是使用,外部可以使用 python所有正常的名字
protect 保护的 在类的内部可以使用,子类可以使用,外部不可以使用 python中没有
private 私有的 只能在类的内部使用,子类和外部都不可以使用 python中的__名字
私有的用法
当一个方法不想被子类继承的时候
有些属性或者方法不希望从外部被调用,只想提供给内部的方法使用
例子:
描述一个房子
单价
面积
长宽高
class Room:def __init__(self,name,price,length,width,height):self.name = nameself.price = priceself.__length = lengthself.__width = widthself.__height = heightdef area(self):return self.__length*self.__widthr = Room('鹏鹏',100,2,1,0.5)
print(r.name)
print(r.price)
print(r.area())class Person:def __init__(self,name,pwd):self.name = nameself.__pwd(pwd)def __pwd(self,pwd):# '12345' ---> ascii ---> 2175981070935self.my_secret_pwd = 2175981070935