python类方法调用装饰_Python类装饰器实现方法详解

本文实例讲述了Python类装饰器。分享给大家供大家参考,具体如下:

编写类装饰器

类装饰器类似于函数装饰器的概念,但它应用于类,它们可以用于管理类自身,或者用来拦截实例创建调用以管理实例。

单体类

由于类装饰器可以拦截实例创建调用,所以它们可以用来管理一个类的所有实例,或者扩展这些实例的接口。

下面的类装饰器实现了传统的单体编码模式,即最多只有一个类的一个实例存在。 instances = {} # 全局变量,管理实例

def getInstance(aClass, *args):

if aClass not in instances:

instances[aClass] = aClass(*args)

return instances[aClass] #每一个类只能存在一个实例

def singleton(aClass):

def onCall(*args):

return getInstance(aClass,*args)

return onCall

为了使用它,装饰用来强化单体模型的类:

@singleton # Person = singleton(Person)

class Person:

def __init__(self,name,hours,rate):

self.name = name

self.hours = hours

self.rate = rate

def pay(self):

return self.hours * self.rate

@singleton # Spam = singleton(Spam)

class Spam:

def __init__(self,val):

self.attr = val

bob = Person('Bob',40,10)

print(bob.name,bob.pay())

sue = Person('Sue',50,20)

print(sue.name,sue.pay())

X = Spam(42)

Y = Spam(99)

print(X.attr,Y.attr)

现在,当Person或Spam类稍后用来创建一个实例的时候,装饰器提供的包装逻辑层把实例构建调用指向了onCall,它反过来调用getInstance,以针对每个类管理并分享一个单个实例,而不管进行了多少次构建调用。

程序输出如下:

Bob 400

Bob 400

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值