前言
笔者在项目开发中经常会使用 @classmethod
, @property
装饰器,在使用过程中也会有疑问,既然都是装饰器,那么这两个装饰器是如何实现的呢?本文主要是揭露这两个官方自带装饰器的实现。
描述符(描述器)
Python2.2 引入了 描述符
,是一种创建托管属性的方法。描述符有诸多优点
- 1.保护属性不受修改
- 2.属性类型检查
- 3.自动更新某个依赖属性的值
从表现形式来看,一个类如果实现了 __get__
, __set__
, __del__
方法的其中一个,并且该类的实例对象通常是另一个类的类属性,那么这个类就是一个描述符。
- 只实现
__get__
方法的对象是非数据描述符,意味着在初始化后之后只能被读取,而同时实现__get__
和__set__
的对象是数据描述符,意味着这种属性式可读写的。
实现代码
class Property(object):
"""属性方法装饰器, @property 的实现
"""
def __init__(self, func):
self._func = func
def __get__(self, instance, owner):
return self._func(instance)
class StaticMethod(object):
"""静态方法装饰器, @staticmethod 的实现
"""
def __init__(self, func):
self._func = func
def __get__(self, instance, owner):
return self._func
class ClassMethod(object):
"""类方法装饰器, @classmethod 的实现
"""
def __init__(self, func):
self._func = func
def __get__(self, instance, owner):
def wrapper(*args, **kwargs):
return self._func(owner, *args, **kwargs)
return wrapper
总结
有代码可知 classmethod
, staticmethod
的实现都是依赖描述符的 __get__
方法。