在Python中,描述符是一個具有特殊方法的類,可以用來控制另一個類的屬性的訪問、賦值和刪除等操作。為了實現數據驗證,可以在描述符類中使用__set_name__()
方法來存儲屬性的名稱,然后在__set__()
方法中進行數據驗證。
下面是一個簡單的示例,展示了如何使用描述符進行數據驗證:
class DataValidator:
def __init__(self, min_value, max_value):
self.min_value = min_value
self.max_value = max_value
self.value = None
def __set_name__(self, owner, name):
self.private_name = '_' + owner.__name__ + '_' + name
def __get__(self, instance, owner):
return self.value
def __set__(self, instance, value):
if not isinstance(value, (int, float)):
raise ValueError(f'Value must be a number')
if value < self.min_value or value > self.max_value:
raise ValueError(f'Value must be between {self.min_value} and {self.max_value}')
self.value = value
class MyClass:
my_attribute = DataValidator(0, 100)
# 正確的使用方式
obj = MyClass()
obj.my_attribute = 50 # 賦值成功
print(obj.my_attribute) # 輸出: 50
# 錯誤的使用方式
obj.my_attribute = '50' # 拋出 ValueError: Value must be a number
obj.my_attribute = 150 # 拋出 ValueError: Value must be between 0 and 100
在這個示例中,DataValidator
類是一個描述符,它接受最小值和最大值作為參數。__set_name__()
方法用于存儲屬性的名稱,__get__()
方法用于獲取屬性值,__set__()
方法用于設置屬性值并進行數據驗證。
在MyClass
類中,my_attribute
屬性使用了DataValidator
描述符,并設置了最小值為0,最大值為100。當我們嘗試給my_attribute
賦值時,描述符會進行數據驗證,確保值是一個數字,并且在允許的范圍內。如果數據驗證失敗,將拋出相應的異常。