# ### property?
"""
可以把方法變成屬性 : 可以動態的控制屬性的獲取,設置,刪除相關操作
@property ?獲取屬性
@方法名.setter ?設置屬性
@方法名.deleter 刪除屬性
"""# 方法一
"""是同一個方法名"""
class MyClass():
?? ?
?? ?def __init__(self,name):
?? ??? ?self.name = name
?? ??? ?
?? ?@property
?? ?def username(self):
?? ??? ?return self.name
?? ??? ?# pass
?? ??? ?
?? ?@username.setter
?? ?def username(self,val):
?? ??? ?# print(val)
?? ??? ?self.name = val
?? ??? ?pass
?? ??? ?
?? ?@username.deleter
?? ?def username(self):
?? ??? ?# print("222")
?? ??? ?del self.name
?? ??? ?passobj = MyClass("小紅")
# 獲取值的時候自動觸發@property 裝飾器下的方法
res = obj.username
print(res)# 設置值的時候自動觸發@username.setter 裝飾器下的方法
obj.username = "小蘭"
print(obj.username)# 刪除值的時候自動觸發@username.deleter 裝飾器下的方法
# del obj.username
# print(obj.username)
# 方法二
class MyClass():?? ?def __init__(self,name):
?? ??? ?self.name = name
?? ??? ?
?? ?# 獲取數據
?? ?def get_username(self):
?? ??? ?return self.name
?? ?
?? ?# 設置數據
?? ?def set_username(self,val):
?? ??? ?self.name = val
?? ?
?? ?# 刪除數據
?? ?def del_username(self):
?? ??? ?del self.name
?? ??? ?
?? ?# 參數的順序: 獲取 , 設置 ?, 刪除
?? ?username = property(get_username , set_username ?, del_username )
?? ??? ?
obj = MyClass("小芳")
# 獲取值的時候,執行get_username下的相關操作
print(obj.username)# 設置值的時候,執行 set_username 下的相關操作
obj.username = "11223344"
print(obj.username)# 刪除值的時候,執行 del_username 下的相關操作
del obj.username
print(obj.username)
# ### 反射
""" 通過字符串操作類對象 或者 模塊中的相關成員的操作 """
"""
#hasattr() 檢測對象/類是否有指定的成員
#getattr() 獲取對象/類成員的值
#setattr() 設置對象/類成員的值
#delattr() 刪除對象/類成員的值?
"""
# ### part1 通過字符串反射類對象中的成員
class Father():
?? ?passclass Mother():
?? ?pass
?? ?
class Children(Father,Mother):
?? ?eye = "藍色的"
?? ?weight = "1噸"
?? ?
?? ?def eat(self):
?? ??? ?print("小孩下生會喝奶")
?? ?
?? ?def drink(self):
?? ??? ?print("小孩下生喜歡喝勇闖天涯...")
?? ??? ?
?? ?def __la(self):
?? ??? ?print("小孩自動啦,無法控制")
?? ?
obj = Children()
?? ?
# (1)hasattr() 檢測對象/類是否有指定的成員
# 對象
res = hasattr(obj,"eye")
print(res)# 類
res = hasattr(Children,"eat123")
print(res)
# (2)getattr() 獲取對象/類成員的值
# 對象
res = getattr(obj,"weight")
print(res)
# 如果獲取的值不存在,可以設置第三個參數,防止報錯
res = getattr(obj,"weight123","抱歉這個值不存在")
print(res)# 類
# 通過類進行反射 (反射出來的是普通方法)
func = getattr(Children,"drink")
print(func)
func(1)
# 通過對象進行反射 (反射出來的是綁定方法)
func = getattr(obj,"drink")
print(func)
func()# 綜合案例
strvar = "eat11"
if hasattr(obj,strvar):
?? ?func = getattr(obj,strvar)
?? ?func()
else:
?? ?print("抱歉,該成員不存在")
# (3) setattr() 設置對象/類成員的值
# 對象
setattr(obj,"skin","黑人")
print(obj.skin)
# 類
setattr(Children,"skin","土耳其人")
print(Children.skin)
print(obj.skin)# (4) delattr() 刪除對象/類成員的值?
# 對象
# delattr(obj,"skin")
# print(obj.skin)# 類
# delattr(Children,"skin")
# print(Children.skin)# ### part2 通過字符串反射模塊中的成員
"""
sys.modules 返回一個系統字典,字典的鍵是加載的所有模塊
'__main__': <module '__main__' from '/mnt/hgfs/python32_gx/day25/2.py'>
字典中的__main__這個鍵對應的是該文件的模塊對象;
"""def func1():
?? ?print("我是func1方法")
def func2():
?? ?print("我是func2方法")
def func3():
?? ?print("我是func3方法")import sys
print(sys.modules) # 系統字典
module = sys.modules["__main__"]
print(module)
res = getattr(module,"func1")
print(res)# 綜合案例 : (通過字符串反射模塊中的成員)
while True:
?? ?strvar = input("請輸入你想要使用的功能:")
?? ?if hasattr(module,strvar):
?? ??? ?func = getattr(module,strvar)
?? ??? ?func()
?? ?elif strvar.upper() == "Q":
?? ??? ?print("再見")
?? ??? ?break
?? ?else:
?? ??? ?print("沒有該成員~!")
### 裝飾器(decorator)
```
定義:裝飾器用于拓展原來函數功能的一種語法,返回新函數替換舊函數
優點:在不更改原函數代碼的前提下 給函數拓展新的功能
```### 方法的分類
```
普通方法: ?沒有任何參數傳遞,只能類調用
綁定方法: ?把默認傳參的方法叫做綁定方法,綁定到對象(默認傳對象),綁定到類(默認傳類)
非綁定方法:靜態方法 (無需傳任何參數,對象和類都能調用)
```
### property
```
用property類裝飾器,修飾的方法,變為描述符
效果:把類中方法變為屬性使用,用來控制描述符的獲取,設置,刪除
```
### 與類相關的魔術屬性
```
# __dict__ 獲取對象或類的內部成員結構
# __doc__ ?獲取對象或類的內部文檔
# __name__ 獲取類名函數名
# __class__ 獲取當前對象所屬的類
# __bases__ 獲取一個類直接繼承的所有父類,返回元組
```
### 反射
```
# 概念:通過字符串去操作類對象 或者 模塊中的屬性方法
# (1)類中的反射
#hasattr() 檢測對象/類是否有指定的成員
#getattr() 獲取對象/類成員的值
#setattr() 設置對象/類成員的值
#delattr() 刪除對象/類成員的值?# (2)模塊的反射
sys.modules 返回一個系統字典,字典的鍵是加載的所有模塊```