2018-07-17-Python全栈开发day28-描述符应用与类的装饰器-part1
生活随笔
收集整理的這篇文章主要介紹了
2018-07-17-Python全栈开发day28-描述符应用与类的装饰器-part1
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1.上下文管理協議
在對文件進行處理也是實例化的過程,在用with打開文件時,會直接出發open函數中的enter方法,在with函數調用結束后,會直接exit方法
根據一切皆對象,除了open類之外,自己也可以自定義類,來自定義根據enter和exit完成特定的目的
class Test:def __init__(self,name):self.name=namedef __enter__(self):print('this is enter')return self#返回一個值給fdef __exit__(self, exc_type, exc_val, exc_tb):print('this is exit')print(exc_type,'exctype')#在代碼塊內如果有一場的話,會將異常類型,異常值,追蹤信息返回print(exc_val,'val')print(exc_tb,'tb') with Test('a') as f:#此時出發enterprint('start opening')#在with內執行代碼 print('this is end')#with內代碼執行完,執行exit代碼,接著執行本段代碼
2.描述符的應用
利用描述符以及描述符的優先級,來給用戶輸入的值進行類型檢測#傳入的值必須是字符串,否則報錯
2.1 錯誤示范
class Fun:def __init__(self,name,age,gender):#name為字符串,age為數字,gender為字符串self.name=nameself.age=ageself.gender=genderdef show(self):print(self.name,self.age,self.gender) p1=Fun('100','yehaibin','male') p1.show()#并不能對輸入的類型進行限制 #其他解決方法:直接str或者int
2.2使用描述符來進行自定義
#利用描述符以及描述符的優先級,來給用戶輸入的值進行類型檢測#傳入的值必須是字符串,否則報錯 #實例化的時候,如果錯了,在調用時提醒 #對值進行設置的時候,如果錯了,則提醒,get和set class Name_Str:def __init__(self,key):self.key=keydef __get__(self, instance, owner):#instance是傳來的實例,# print(instance)return instance.__dict__[self.key]def __set__(self, instance, value):if isinstance(value,str):# type(self.key) == str:instance.__dict__[self.key] = valueelse:print('your input %s is wrong,please input an str' %self.key)def __delete__(self, instance):pass class Age_Int:def __init__(self,key):#key為‘’ageself.key=keydef __get__(self, instance, owner):#instance是傳來的實例,# print(instance)return instance.__dict__[self.key]def __set__(self, instance, value):if isinstance(value,int):# type(self.key) == str:instance.__dict__[self.key] = valueelse:print('your input %s is wrong,please input an int' %self.key)def __delete__(self, instance):passclass Fun:#直接在設置屬性的時候,進行查看name=Name_Str('name')age=Age_Int('age')gender=Name_Str('gender')def __init__(self,name,age,gender):#name為字符串,age為數字,gender為字符串self.name=nameself.age=ageself.gender=genderdef show(self):print(self.name,self.age,self.gender) p1=Fun('100',555,'100') # print(p1.name)#因為數據描述符的屬性比實例屬性的級別高,所以直接調用數據描述符get # p1.name='500' # print(p1.name) # p1.gender='500' # print(p1.gender) p1.age=11#出發set,p1為instance,11為value print(p1.age)
?
轉載于:https://www.cnblogs.com/hai125698/p/9326678.html
總結
以上是生活随笔為你收集整理的2018-07-17-Python全栈开发day28-描述符应用与类的装饰器-part1的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用别名访问MSSQL Express
- 下一篇: jQuery中的表单对象属性过滤选择器(