本篇文章帶給大家的內容是關於python中屬性描述符的詳細介紹(程式碼範例),有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。
作為一個小白,每天都在不斷地看東西,學知識,今天給大家介紹一個好東西-屬性描述子
什麼是屬性描述符呢?
其實在一個類別中實作set__、__get__、__delete中任一個魔法函數就是一個屬性描述符。
接下來我們定義一個屬性描述符:
class IntegerField: def __get__(self, instance, owner): pass def __set__(self, instance, value): pass def __delete__(self, instance): pass class User: high= IntField()
__get__:當我們用類別或實例來呼叫該屬性時,會傳回__get__函數的結果。
__set__:當我們用實例來設定屬性值時,Python會呼叫該函數。對類別沒有限製作用。
__delete__:當我們用實例試圖刪除該屬性時,Python會呼叫該函數。對類別沒有限製作用。
到底這個東西怎麼用呢?接下來為大家修改上面的程式碼
class IntegerField: def __get__(self, instance, owner): return self.value def __set__(self, instance, value): if not isinstance(value,numbers.Integral): raise ValueError("请输入一个整数") self.value=value def __delete__(self, instance): pass class User: high=IntegerField() #验证代码 if __name__ == '__main__': user=User() user.high='175' #报错,ValueError:请输入一个整数 User.high=175 #正确执行,不报错
這樣我們就能夠運用屬性描述符來給屬性附上一定的邏輯了。
其實在屬性描述符下還分為
1、資料描述符:實作了__set__、__get__
if __name__ == '__main__': user=User() user.high=175 print(user.__dict__) #high是不放入__dict__中的,优先查找数据描述符中的值 user.__dict__["high"]="abc" #这样赋值时可以的,并且可以放入__dict__中 print(user.high) #会报错,因为在调用__get__方法时并没有value属性
2、非資料:實作__get__不實作__set__
#class NonField: def __init__(self, high=170): self.value = high def __get__(self, instance, owner): return self.value class User: high = NonField() if __name__ == '__main__': user = User() user.high = '175' #会放入user.__dict__中 print(user.__dict__)
以上是python中屬性描述符的詳細介紹(程式碼範例)的詳細內容。更多資訊請關注PHP中文網其他相關文章!