TA的每日心情 | 擦汗 昨天 09:05 |
---|
签到天数: 1048 天 连续签到: 1 天 [LV.10]测试总司令
|
它使用额外的 Python 语句修改旧对象并返回相同的引用。
例如,考虑下面的类,它有两个方法:__init__和 display。__init__方法在显示输出名称时初始化名称变量:
- class Student:
- def __init__(self, name):
- self.name = name
- def display(self):
- print('Name:', self.name)
复制代码 要在 Python 中装饰这个类,我们可以向该类添加新方法或修改现有方法,或者两者都做。
此外,在 Python 中有两种方法可以做到这一点,要么使用函数装饰器,要么使用类装饰器。
让我们一个一个看下例子。
使用函数装饰器装饰类
要使用函数装饰器来装饰类,接受类作为参数,修改其代码并在最后返回类。
- def mydecorator(student):
- #define a new display method
- def newdisplay(self):
- print('Name: ', self.name)
- print('Subject: Programming')
- #replace the display with newdisplay
- student.display = newdisplay
- #return the modified student
- return student
- @mydecorator
- class Student:
- def __init__(self, name):
- self.name = name
- def display(self):
- print('Name:', self.name)
- obj = Student('Pencil Programmer')
- obj.display()
- '''
- Name: Pencil Programmer
- Subject: Programming
- '''
复制代码 如果类中不存在 display 方法,则 newdisplay 将作为 display 方法添加到类中。
由于类的引用在装饰器函数中是可用的,我们除了修改现有方法外,还可以为类添加新的属性和方法
使用类装饰器装饰类
要使用类装饰器装饰类,接受类的引用作为参数(在装饰器的__init__方法中),在 __call__方法中修改其代码,最后返回修改后的类的实例。
- class Mydecorator:
- #accept the class as argument
- def __init__(self, student):
- self.student = student
- #accept the class's __init__ method arguments
- def __call__(self, name):
- #define a new display method
- def newdisplay(self):
- print('Name: ', self.name)
- print('Subject: Python')
- #replace display with newdisplay
- self.student.display = newdisplay
- #return the instance of the class
- obj = self.student(name)
- return obj
- @Mydecorator
- class Student:
- def __init__(self, name):
- self.name = name
- def display(self):
- print('Name: ', self.name)
- obj = Student('Pencil Programmer')
- obj.display()
- '''
- Name: Pencil Programmer
- Subject: Python
- '''
复制代码 这里唯一的区别是我们返回的是对象的引用而不是类引用。
|
|