实现staticmethod装饰器一样的非数据描述器

作者: 青蛙兄 分类: 习题 发布时间: 2019-11-10 16:27

在我们知道了什么是非数据描述器,和数据描述器之后,我们现在可以做下面的练习

实现一个与静态方法staticmethod一样的装饰器,完成staticmethod装饰器的功能

class StaticMethod:  
    def __init__(self, fn):  
        self.fn = fn  
  
    def __get__(self, instance, owner):  
        print('StaticMethod__get__', self, instance, owner)  
        return self.fn  
  
  
class A:  
    @StaticMethod  
    def foo():  # 相当于 foo = StaticMethod(foo)  
        print('this is static')  
  
  
f = A.foo  
# StaticMethod__get__ <__main__.StaticMethod object at 0x00000188F3818668> None   
  
f()  
# this is static  

[v_blue]foo = StaticMethod(foo) StaticMethod(foo)是一个类方法,并且这个方法实现了__get__方法,[/v_blue]
[v_blue]当A.foo的时候,等于触发了非数据描述器,被截取,__get__方法返回foo函数本身,至此f()可调用[/v_blue]
[v_blue]StaticMethod装饰器实现的与系统staticmethod装饰器一样的功能,编译器不认识StaticMethod,所以def foo():这里会出现红色的错误标识[/v_blue]

一条评论
  • 匿名

    2019-11-11 下午11:39

    非常好

发表评论

电子邮件地址不会被公开。