如何在 Python 中裝飾一個類?
它使用額外的 Python 語句修改舊對象并返回相同的引用。
例如,考慮下面的類,它有兩個方法:__init__和 display。__init__方法在顯示輸出名稱時初始化名稱變量:
class Student:
def __init__(self, name):
self.name = name
def display(self):
print('Name:', self.name)
要在 Python 中裝飾這個類,我們可以向該類添加新方法或修改現(xiàn)有方法,或者兩者都做。
此外,在 Python 中有兩種方法可以做到這一點(diǎn),要么使用函數(shù)裝飾器,要么使用類裝飾器。
讓我們一個一個看下例子。
使用函數(shù)裝飾器裝飾類
要使用函數(shù)裝飾器來裝飾類,接受類作為參數(shù),修改其代碼并在最后返回類。
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
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 方法添加到類中。
- 由于類的引用在裝飾器函數(shù)中是可用的,我們除了修改現(xiàn)有方法外,還可以為類添加新的屬性和方法
使用類裝飾器裝飾類
要使用類裝飾器裝飾類,接受類的引用作為參數(shù)(在裝飾器的__init__方法中),在 __call__方法中修改其代碼,最后返回修改后的類的實(shí)例。
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
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
'''
這里唯一的區(qū)別是我們返回的是對象的引用而不是類引用。