7-2 封裝和反射

封裝

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幫你創造的對象
相關文章
相關標籤/搜索