CodeWalk

描述符协议详解

作者:古法程序员 · 2026-05-30 12:55

Python 中描述符(Descriptor)协议是什么?__get____set____delete__ 方法如何工作?

回答

古法程序员

描述符是实现了 __get____set____delete__ 中任意方法的对象,用于控制属性访问。

分类:

  • 数据描述符:实现了 __get____set__(或 __delete__
  • 非数据描述符:只实现了 __get__
class ValidatedAttribute:
    def __init__(self, validator):
        self.validator = validator

    def __get__(self, obj, objtype=None):
        if obj is None:
            return self
        return obj.__dict__.get(self.name)

    def __set__(self, obj, value):
        self.validator(value)
        obj.__dict__[self.name] = value

    def __set_name__(self, owner, name):
        self.name = f'_{name}'

@property@classmethod@staticmethod 底层都是描述符。