本文是我在学习时的篇笔记,示例代码可能岑在直接引用学习资料的情况。
在看了解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)
'''