解答三個問題,描述是什麼?如何實現?使用場景?
一、什麼是描述符
描述符就是乙個具有繫結行為的物件屬性,其屬性訪問將由描述符協議中的方法覆蓋。這些方法為 __get__、__set__ 和 __delete__。如果這些方法中的任何乙個針對某個物件定義,那麼它就被認為是乙個描述符。
__get__ 用於訪問屬性。它返回屬性的值,或者在所請求的屬性不存在的情況下出現 attributeerror 異常
__set__ 將在屬性分配操作中呼叫。不會返回任何內容
__delete__ 控制刪除操作。不會返回內容
二、描述符的實現方式
2.1 基於類建立
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# __author__ = 'liao gao xiang'
class descriptor(object):
def __init__(self):
self._name = ''
def __get__(self, instance, owner):
print("__get__")
return self._name
def __set__(self, instance, value):
print("__set__")
self._name = value
def __delete__(self, instance):
print("__delete__")
del self._name
class person(object):
name = descriptor()
p = person()
print(p.name)
p.name = 'liao gao xiang'
del p.name
# print(p.name)
2.2 使用propety()函式
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# __author__ = 'liao gao xiang'
class person(object):
def __init__(self):
self._name = ''
def fget(self):
print("getting: %s" % self._name)
return self._name
def fset(self, value):
print("setting: %s" % value)
self._name = value.title()
def fdel(self):
print("deleting: %s" % self._name)
del self._name
name = property(fget, fset, fdel, "i'm the property.")
p = person()
print(p.name)
p.name = 'liao gao xiang'
del p.name
# print(p.name)
2.3 使用@property裝飾器
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# __author__ = 'liao gao xiang'
class person(object):
def __init__(self, name):
self._name = name
@property
def name(self):
print("get_name")
return self._name
@name.setter
def name(self, value):
print("set_name")
self._name = value
@name.deleter
def name(self):
print("del_name")
del self._name
p = person()
print(p.name)
p.name = 'liao gao xiang'
del p.name
# print(p.name)
三、描述符的使用場景
通過結合使用描述符,可以實現優雅的程式設計,允許建立 setters 和 getters 以及唯讀屬性
根據值或型別請求進行屬性驗證
大量用於各種框架中,比如django的models
python 描述 python描述符
在python中,訪問乙個屬性的優先順序順序按照如下順序 1.類屬性2.資料描述符3.例項屬性4.非資料描述符5.getattr 方法。描述符,用一句話來說,就是將某種特殊型別的類的例項指派給另乙個類的屬性 注意 這裡是類屬性,而不是物件屬性 而這種特殊型別的類就是實現了 get set delet...
python 描述符基本
相關資料 python的描述符 下一站,我等你 描述符的本質類 python為開發者提供了乙個非常強大的功能 描述符。那什麼是描述符呢?通過檢視python的官方文件,我們知道把實現了 get set 和 delete 中的其中任意一種方法的類稱之為描述符,描述符的本質是新式類,並且被 的類 即應用...
Python 描述符練習
要求 先定義乙個溫度類,然後定義兩個描述符用於描述攝氏度和華氏度兩個屬性 要求這個兩個屬性會自動進行轉換,也就是說你可以給攝氏度這個屬性賦值,然後列印的話華氏屬性是自動轉換的結果 class celsius def init self,value 26.0 self.value float valu...