1 【封裝是什麼】python
隱藏對象的屬性和實現細節,僅對外提供公共訪問方式。安全
2【好處】spa
1. 將變化隔離;code
2. 便於使用;對象
3. 提升複用性;blog
4. 提升安全性;內存
【封裝原則】字符串
1. 將不須要對外提供的內容都隱藏起來;get
2. 把屬性都隱藏,提供公共方法對其訪問。it
二 私有變量和私有方法
在python中用雙下劃線開頭的方式將屬性隱藏起來(設置成私有的)
三 實例
1 私有變量
#私有屬性 # class Person(): # __country='中國' # print(__country) # print(Person.__dict__) # print(Person._Person__country) # 不能使用這種方式去調用私有的變量 # #私有的名字,只能在類的內部使用,不能在類的外部使用 # Person.__name='XXX' #在類的外部不能定義私有變量 # print(Person.__name) # print(Person.__dict__)
2私有方法
1 # 在類的內部 若是使用__變量的形式會發生變形,python會自動的爲你加上_類名 2 # class Person(): 3 # __country='中國' #私有的靜態屬性 4 # def __init__(self,name,pwd): 5 # self.name=name 6 # self.__pwd=pwd #私有的對象屬性 7 # def login(self): 8 # print(self.__dict__) 9 # if self.name=='alex' and self.__pwd=='alex3714': 10 # print('登陸成功') 11 # alex=Person('alex','alex3714') 12 # alex.login() 13 # print(alex.__dict__)
總結
# 靜態屬性 、 對象屬性、 方法(動態屬性) 前面加上雙下劃綫都會變成私有的
# 私有的特色就是隻能在類的內部調用,不能在類的外部使用
一 概念
# 什麼叫反射
# 經過字符串數據類型的 變量名 來訪問變量的值
2 反射的四種類型
# 類名 反射 靜態屬性
# 對象名 反射 對象屬性 和 方法
# 模塊 反射 模塊中的名字
# 反射 本身所在文件中的名字
# x.y 這樣的形式 均可以用反射
3實例
1)類名 反射 靜態屬性
1 # class Person: 2 # role='Person' 3 # def __init__(self,name): 4 # self.name=name 5 # def eat(self):print('eating') 6 # def drink(self):print('drinking') 7 # 8 # alex=Person('alex') 9 # print(alex.name) #正常的獲取 10 # # 11 # # print(getattr(alex,'name')) #利用反射獲取 對象反射對象屬性 12 # # 13 # # print(getattr(Person,'role')) #類名反射靜態屬性
2)
1 # 模塊 反射 模塊中的名字 2 #本身先建個一個py文件即模塊 mymodules.py
3 4 # import mymodules 5 # mymodules.func1() 6 # getattr(mymodules,'func1')() #反射模塊中的方法 7 # # print(mymodules.money) 8 # print(getattr(mymodules,'money')) #反射模塊中的靜態屬性
3)
#調用模塊中的類方法 # Manager=getattr(mymodules,'Manager') # a=Manager() # a.eat()
4)
1 # 反射 本身所在文件中的名字 2 import sys 3 # value='123' 4 # print(sys.modules['__main__']) #打印本身文件所在的路徑 5 # print(getattr(sys.modules['__main__'],'value'))
#總結:
# 首先 使用getattr取獲取一個名字,若是在這個對象的命名空間中沒有這個名字 會報錯
# getattr的反射好伴侶 hasattr
# 若是使用getattr取獲取一個方法,那麼只能拿到這個方法的內存地址 加上括號就是執行,固然,括號裏的參數能夠照傳不誤
# 若是getattr獲取一個屬性,那麼直接使用反射就能夠獲取到值 如:print(getattr(alex,'name'))
三 __new__ 構造方法,建立一個對象
1 # class Foo: 2 # def __new__(cls,*args,**kwargs):#cls是類,由於這時候self還麼有 3 # print('執行我了') 4 # obj=object.__new__(cls) #這個就是self 5 # print(obj) 6 # return obj 7 # def __init__(self): 8 # print('2222222',self) 9 # Foo()
#總結
# 先執行new方法,object.new()
# 再執行init
#具體的執行過程# Foo() --> python解釋器接收到你的python代碼# python解釋器替你去作了不少操做# 包括 主動幫助你 調用 new方法 去創造一個對象 —— 開闢內存空間 —— python語言封裝了開闢內存的工做# object的new方法裏 —— 幫你創造了對象# 調用init用到的self參數 就是new幫你創造的對象