装饰类以在调用 __get__() 时运行一段代码

Posted

技术标签:

【中文标题】装饰类以在调用 __get__() 时运行一段代码【英文标题】:Decorate class to run a piece of code when __get__() is called 【发布时间】:2020-07-26 00:29:41 【问题描述】:

请看下面的代码

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

【问题讨论】:

这就是property(装饰器的应用)的用途。 如果您想将内存中的对象持久保存到数据库中,您可能还想考虑使用 ORM(如 SqlAlchemy)。 非常感谢您的建议。我来看看属性函数 @chepner 似乎 property 需要在类中实现以创建特定函数的设置器或获取器或删除器。我可以在装饰器中使用它来动态装饰多个类吗? 【参考方案1】:

如果所有类都实现相同的方法,比如get_student_idget_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。

【讨论】:

非常感谢您的建议。我所有的课程都有不同的方法和属性。我希望为所有类制作一些通用的东西 在获取所有类方法名称的列表并执行cls.method_name = _method_decorator(cls.method_name) 之后?我可以得到这样的方法名称methods_list = [prop for prop in cls.__dict__.keys() if not prop.startswith('_')] @SomeshGarje 那么也许你想参考这个答案:***.com/q/6307761/13298288

以上是关于装饰类以在调用 __get__() 时运行一段代码的主要内容,如果未能解决你的问题,请参考以下文章

Python之路:描述符,类装饰器,元类

描述器学习小结

@property和@score.setter的用法

函数式编程-装饰器

Python不归路_装饰器

python描述符property函数(类)装饰器实例解析