python學習之類的反射(2018.6.18)
阿新 • • 發佈:2018-06-18
python asa 定義 day6 dict try 屬性 cts set
在學習網絡編程的時候用到反射,然後發現自己反射這部分的應用不是很熟練,決定返回來重新整理一下
對於類的反射,主要有四個用法,下面都說一下
1.hasattr 判斷對象或者類是否存在指定的屬性,看代碼以及結果
class people: def __init__(self,name,age): self.name = name self.age = age def talk(self): print("%s is talking."%self.name) p1 = people(‘alex‘,18) print(hasattr(p1,‘name‘)) print(hasattr(p1,‘sex‘)) 結果 True False
hasattr判斷完成後,會返回一個布爾值,有就返回True,無就返回False
2.getattr 獲取到一個對象或者類的屬性,加()就是執行,看代碼
class people: def __init__(self,name,age): self.name = name self.age = age def talk(self): print("%s is talking."%self.name) p1 = people(‘alex‘,18) print(getattr(p1,‘name‘)) print(getattr(p1,‘sex‘,‘man‘)) print(getattr(p1,‘sex‘)) 結果 alex man File "D:/PycharmProjects/s2018/day6/test.py", line 13, in <module> print(getattr(p1,‘sex‘)) AttributeError: ‘people‘ object has no attribute ‘sex‘
對於getattr,如果對象或者是類有輸入的屬性,則,返回正確屬性。無則報錯,如果我們指定默認值,則返回默認值,在看一下其他
class people: def __init__(self,name,age,sex): self.name = name self.age = age self.sex = sex def talk(self): print("%s is talking."%self.name) p1 = people(‘alex‘,18,‘woman‘) getattr(p1,‘talk‘)()#getattr獲取到方法後加()就是執行 print(getattr(p1,‘sex‘,‘man‘))#類內如果對屬性已經確認過,顯示對象已經確認的值,而不顯示默認值 結果 alex is talking. woman
3.setattr 是修改已有的屬性或者是新加一個屬性,看代碼
class people: def __init__(self,name,age,sex): self.name = name self.age = age self.sex = sex def talk(self): print("%s is talking."%self.name) p1 = people(‘alex‘,18,‘woman‘) print(‘修改前‘,p1.age) setattr(p1,‘age‘,20) print(‘修改後‘,p1.age) setattr(p1,‘country‘,‘China‘) print(p1.__dict__) 結果 修改前 18 修改後 20 {‘country‘: ‘China‘, ‘name‘: ‘alex‘, ‘sex‘: ‘woman‘, ‘age‘: 20}
4.delattr就是對現有的對象或者類的屬性就行刪除,這個比較簡單,看代碼
class people: def __init__(self,name,age,sex): self.name = name self.age = age self.sex = sex def talk(self): print("%s is talking."%self.name) p1 = people(‘alex‘,18,‘woman‘) print(‘修改前‘,p1.__dict__) delattr(p1,‘name‘) print(‘修改後‘,p1.__dict__) 結果 修改前 {‘age‘: 18, ‘name‘: ‘alex‘, ‘sex‘: ‘woman‘} 修改後 {‘age‘: 18, ‘sex‘: ‘woman‘}
5.學會基本的,還是需要一些應用才可以,寫一個比較的應用,正好也是我在網絡編程中需要的,看代碼
class Servers:#定義一個服務器類 def run(self):#定義方法run while True: cmds = input(">>>>:").strip().split()#將輸入的命令行進行分解,分解成前面命令以及後面的文件名 if hasattr(self,cmds[0]):#判斷是否有命令! func = getattr(self,cmds[0])#如果命令存在則執行 func(cmds) else: print(‘你的輸入錯誤!‘) continue def get(self,cmds):#演示 print(‘get.....‘,cmds[1]) def put(self,cmds):#演示 print(‘put.....‘,cmds[1]) obj = Servers() obj.run() 結果 >>>>:get a.txt get..... a.txt >>>>:put a.txt put..... a.txt >>>>:gett a 你的輸入錯誤! >>>>:
以上就是類的反射的一些基本應用,任何知識都是基本簡單,組合難,就看大家如何組合了,後面又想到其他想法,也會再去更新這個
2018.6.18
python學習之類的反射(2018.6.18)