1

请看下面的代码

class MyStudent:
    def __init__(self, student_id, student_name):
        self._student_id = student_id
        self._student_name = student_name

    def get_student_id(self):
        return self._student_id

    def get_student_name(self):
        return self._student_name


student1 = MyStudent(student_id=123, student_name="ABC")
student1.get_student_id()
student1.get_student_name()

我想运行一些代码,例如每当student1.get_student_id()或被student1.get_student_name()调用时(或在访问get () 时将学生添加到数据库中。如果我使用了错误的描述符,请纠正我)。我必须通过装饰器来做到这一点,只适用于下面的多个类

@save_student_to_db
class MyStudent:......

使用装饰器如何实现这一点?我需要对可以有任何方法的多个类使用单个装饰器。每当调用任何类的任何方法(除了以 _ 或 __ 开头的方法)时,装饰器都应将数据保存到 DB

4

1 回答 1

1

如果所有类都实现了相同的方法,比如get_student_idand get_student_name,并且具有相同的属性,比如_student_idand _student_name,那么你可以像这样做一个类装饰器:

from functools import wraps
from somewhere import Database

@wraps(fn)
def _method_decorator(fn):
    def getter_wrapper(self):
        db = Database()
        db.save(self._student_id, self._student_name)
        return fn(self)
    return getter_wrapper

def save_student_to_db(cls):
    cls.get_student_id = _method_decorator(cls.get_student_id)
    cls.get_student_name = _method_decorator(cls.get_student_name)
    return cls

关于数据库,您可以在每次需要时实例化它,就像我上面建议的那样,或者让依赖注入框架为您完成。我已经使用了一段时间的注射剂,它非常简单但功能强大,也有血清

于 2020-04-13T13:26:42.890 回答