请看下面的代码
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()时,我都会运行一些类似将学生添加到数据库的代码。如果我使用了错误的描述符,请更正我)。而且我只能通过Decorators对多个类进行此操作,如下所示
@save_student_to_db
class MyStudent:......
如何使用装饰器来实现?我需要对可以具有任何方法的多个类使用单个装饰器。每当调用任何类的任何方法(除了以_或__开头的方法)时,装饰器都应将数据保存到DB
[如果所有类都实现相同的方法,例如get_student_id
和get_student_name
,并且具有相同的属性,例如_student_id
和_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
关于数据库,您可以在每次需要它时都实例化它,如我上面所建议的,或者有一个依赖项注入框架为您完成它。我使用injectable已有一段时间了,它非常简单但功能强大,也有serum。