封装2
面向對象的三大特性:繼承 多態? 封裝
封裝
廣義上的
狹義上的:會對一種現象起一個專門屬于它的名字
把一對東西裝在一個容器里
函數和屬性撞到了一個非全局的命名空間 -- 封裝
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
?
轉載于:https://www.cnblogs.com/hanjiahao/p/8903250.html
總結
- 上一篇: 十八岁的生日在今朝是什么歌?
- 下一篇: 求一个一个字的微信网名