如何在 Python 中装饰一个类?

发表于:2022-9-09 09:33

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:佚名    来源:python运维技术

#
Python
分享:
  它使用额外的 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
  '''
  这里唯一的区别是我们返回的是对象的引用而不是类引用。
  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号