PHP前端开发

如何在 Python 中装饰一个类?

百变鹏仔 1个月前 (01-21) #Python
文章标签 如何在

它使用额外的 Python 语句修改旧对象并返回相同的引用。

例如,考虑下面的类,它有两个方法:__init__和 display。__init__方法在显示输出名称时初始化名称变量:

class Student:def __init__(self, name):self.name = namedef display(self):print('Name:', self.name)

要在 Python 中装饰这个类,我们可以向该类添加新方法或修改现有方法,或者两者都做。

此外,在 Python 中有两种方法可以做到这一点,要么使用函数装饰器,要么使用类装饰器。

让我们一个一个看下例子。

使用函数装饰器装饰类

要使用函数装饰器来装饰类,接受类作为参数,修改其代码并在最后返回类。

def mydecorator(student):#define a new display methoddef newdisplay(self):print('Name: ', self.name)print('Subject: Programming')#replace the display with newdisplaystudent.display = newdisplay#return the modified studentreturn student@mydecoratorclass Student:def __init__(self, name):self.name = namedef display(self):print('Name:', self.name)obj = Student('Pencil Programmer')obj.display()'''Name: Pencil ProgrammerSubject: Programming'''

如果类中不存在 display 方法,则 newdisplay 将作为 display 方法添加到类中。

使用类装饰器装饰类

要使用类装饰器装饰类,接受类的引用作为参数(在装饰器的__init__方法中),在 __call__方法中修改其代码,最后返回修改后的类的实例。

class Mydecorator:#accept the class as argumentdef __init__(self, student):self.student = student#accept the class's __init__ method argumentsdef __call__(self, name):#define a new display methoddef newdisplay(self):print('Name: ', self.name)print('Subject: Python')#replace display with newdisplayself.student.display = newdisplay#return the instance of the classobj = self.student(name)return obj@Mydecoratorclass Student:def __init__(self, name):self.name = namedef display(self):print('Name: ', self.name)obj = Student('Pencil Programmer')obj.display()'''Name: Pencil ProgrammerSubject: Python'''

这里唯一的区别是我们返回的是对象的引用而不是类引用。

原文:​​https://www.php.cn/link/137ffea9336f8b47a66439fc34e981ee​​