调用__get__()时将class修饰成运行一段代码
Decorate class to run a piece of code when __get__() is called
请看下面的代码
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 只对多个 classes 执行此操作,如下所示
@save_student_to_db
class MyStudent:......
如何使用装饰器实现这一点?我需要为多个可以有任何方法的 classes 使用一个装饰器。每当调用任何 class 的任何方法(除了以 _ 或 __ 开头的方法)时,装饰器应将数据保存到 DB
如果所有 class 实现相同的方法,比如 get_student_id
和 get_student_name
,并且具有相同的属性,比如 _student_id
和 _student_name
,然后你可以像这样做一个 class 装饰器:
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 for a while and it is quite simple and yet powerful, there is serum。
请看下面的代码
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 只对多个 classes 执行此操作,如下所示
@save_student_to_db
class MyStudent:......
如何使用装饰器实现这一点?我需要为多个可以有任何方法的 classes 使用一个装饰器。每当调用任何 class 的任何方法(除了以 _ 或 __ 开头的方法)时,装饰器应将数据保存到 DB
如果所有 class 实现相同的方法,比如 get_student_id
和 get_student_name
,并且具有相同的属性,比如 _student_id
和 _student_name
,然后你可以像这样做一个 class 装饰器:
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 for a while and it is quite simple and yet powerful, there is serum。