博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python 类的装饰器
阅读量:5883 次
发布时间:2019-06-19

本文共 2406 字,大约阅读时间需要 8 分钟。

我们知道,在不改变原有代码的基础上,我们可以使用装饰器为函数添加新的功能。同理,一切皆对象,我们也可以使用装饰器为类添加类属性。what?

  

def deco(obj):    obj.x = 1    obj.y = 2    return obj@deco  # Foo = deco(Foo)class Foo:    passprint(Foo.__dict__)

上述的代码为Foo属性字典添加了x和y属性,但如果想添加'name' = 'harden'呢,这需要更灵活的定义了。so

def deco(**kwargs):    def wrapper(obj):        for k, v in kwargs.items():            setattr(obj, k, v)        return obj    return wrapper@deco(x=1, y=2)class Foo:    passprint(Foo.__dict__)
{
'__module__': '__main__', '__dict__':
, '__weakref__':
, '__doc__': None, 'x': 1, 'y': 2}

我们再定义类Bar,

@deco(name='curry')class Bar:    pass

name属性也可以添加进去

再来个升级版,利用数据描述符和类的装饰器为类属性限定数据类型

我们知道,在不改变原有代码的基础上,我们可以使用装饰器为函数添加新的功能。同理,一切皆对象,我们也可以使用装饰器为类添加类属性。what?  def deco(obj):    obj.x = 1    obj.y = 2    return obj@deco  # Foo = deco(Foo)class Foo:    passprint(Foo.__dict__)上述的代码为Foo属性字典添加了x和y属性,但如果想添加'name' = 'harden'呢,这需要更灵活的定义了。sodef deco(**kwargs):    def wrapper(obj):        for k, v in kwargs.items():            setattr(obj, k, v)        return obj    return wrapper@deco(x=1, y=2)class Foo:    passprint(Foo.__dict__){
'__module__': '__main__', '__dict__':
, '__weakref__':
, '__doc__': None, 'x': 1, 'y': 2}我们再定义类Bar,@deco(name='curry')class Bar: passname属性也可以添加进去再来个升级版,利用数据描述符和类的装饰器为类属性限定数据类型#数据描述符,代理另一个新式类的属性class Typedef: def __init__(self, key, expected_type): self.key = key self.expected_type = expected_type def __get__(self, instance, owner): # print('exec __get__') # print(instance) # print(owner) return instance.__dict__[self.key] def __set__(self, instance, value): # print('exec __set__') if not isinstance(value, self.expected_type): raise TypeError instance.__dict__[self.key] = value def __delete__(self, instance): instance.__dict__.pop(self.key)def deco(**kwargs): def wrapper(obj): for k, v in kwargs.items():       #为obj添加属性 如 name = Tpyedef('name', str) setattr(obj, k, Typedef(k, v)) return obj return wrapper@deco(name=str, age=int, salary=float) # =====》People= wrapper(People)class People: def __init__(self, name, age, salary): self.name = name self.age = age self.salary = salaryp1 = People('handen', 18, 111.11)print(p1.name)print(p1.__dict__)

 

转载于:https://www.cnblogs.com/jeavy/p/10051889.html

你可能感兴趣的文章
Linux Kernel中断子系统来龙去脉浅析【转】
查看>>
Linux NFS服务器的安装与配置
查看>>
Ada boost学习
查看>>
Unity中SendMessage和Delegate效率比较
查看>>
Linux下EPoll通信模型简析
查看>>
react-native 制作购物车ShopCart
查看>>
Linux服务器 java生成的图片验证码乱码问题
查看>>
【转】QT中QDataStream中浮点数输出问题
查看>>
活动实录 | Design For Failure——饿了么技术运维实践
查看>>
402. Remove K Digits
查看>>
用户吐槽:Azure DevOps CI 体验太差
查看>>
C# 8的Ranges和递归模式
查看>>
为所有PHP-FPM容器构建单独的Nginx Docker镜像
查看>>
一文看完HTTP3的演化历程
查看>>
立下“去O”Flag的AWS,悄悄修炼了哪些内功?
查看>>
依赖类型语言Idris发布1.0版本
查看>>
四种方式主导你的第一个敏捷项目
查看>>
2019年,你需要关注这些Node API和Web框架
查看>>
Entity Framework Core 2.0的突破性变更
查看>>
QCon上海2015盛大开幕
查看>>