Python 修饰类的装饰器

版权声明:本文为博主原创文章,转载请注明原文链接。 https://blog.csdn.net/Frank_Abagnale/article/details/82143855

本文是我在学习时的篇笔记,示例代码可能岑在直接引用学习资料的情况。
在看了解Python类装饰器之前可以先了解一下Python函数装饰器

#!/usr/bin/env python
# -*- coding: utf-8 -*-

'''
    之前的例子中装饰器接收一个函数,并返回一个函数,从而起到加工函数的效果。
在Python 2.6以后,装饰器被拓展到类。一个装饰器可以接收一个类,并返回一个类,
从而起到加工类的效果。
'''
def decorator(aClass):  ##接收一个类
  class newClass:
    def __init__(self, age):
      self.total_display = 0
      self.wrapped = aClass(age)  ### 在这里重新实例化了被修饰类的对象

    def display(self):            ## 必须与被修饰类的方法名对应。
      self.total_display += 1
      print("total display", self.total_display)
      self.wrapped.display()      ### 在这里实际调用display方法。

    def addAge(self,years = 1):
      self.wrapped.addAge(years)       ### 这里只是重写的一下,并没有进行修饰


  return newClass  ## 返回一个类

@decorator
class Bird:
  def __init__(self, age):
    self.age = age

  def display(self):
    print("My age is", self.age)

  def addAge(self,years = 1):
    self.age = self.age + years

if __name__ == "__main__":
  eagleLord = Bird(5)
  for i in range(3):
    eagleLord.addAge()
    eagleLord.display()
'''
@decorator
  当没有装饰器装饰的时候,主函数部分功能如下:
1.实例化Bird类,并将age成员的初值设置为5
2.循环3次,分别依次调用addAge和display方法。
输出如下:
('My age is', 6)
('My age is', 7)
('My age is', 8)
'''
'''
   当被修饰后,display方法被修饰,增加total_display的计数和打印计数,
addAge方法只是在修饰器中被重新调用了一下。输出如下:
('total display', 1)
('My age is', 6)
('total display', 2)
('My age is', 7)
('total display', 3)
('My age is', 8)
'''

猜你喜欢

转载自blog.csdn.net/Frank_Abagnale/article/details/82143855
今日推荐