如何编写依赖于类属性的Python装饰器?或者有更好的方法来解决这个问题吗?

问题描述 投票:0回答:1

我正在编写一个类,它从 api 获取外部对象,对该对象执行一些处理,公开一些有用的方法,然后将处理后的对象写入数据库。在外部对象不再存在的情况下,我希望类方法使用数据库记录中的数据。

这导致类方法中出现大量重复的简单代码:

class Synchronised_object:
    def __init__(self, obj=None, rec=None):

        self.object = obj
        self.record = rec

    def a(self):
        if self.object:
            return self.object.a
        else:
            return self.record['a']

    def b(self):
        if self.object:
            return self.object.b.upper()
        else:
            return self.record['b']

函数中重复的简单代码听起来像是装饰器的一个很好的用例,但在这种情况下,装饰器代码将依赖于实例化类对象的属性,从我在这里和其他地方读到的所有内容来看,这似乎都是有问题的。

有没有办法写一个依赖于 self.object 的装饰器?如果没有,是否有另一种方法可以减少“if self.object...else return self.record[name]”的重复?

python python-3.x python-decorators
1个回答
0
投票

您实际上只需要一个处理延迟记录逻辑的方法。比如:

class SynchronisedObject:
    def __init__(self, obj=None, rec=None):
        self.object = obj
        self.record = rec
    def _proxy(self, attr):
        if self.object:
            return getattr(self.object, attr)
        return self.record[attr]
    def a(self):
        return self._proxy("a")
    def b(self):
        return self._proxy("b").upper()
© www.soinside.com 2019 - 2024. All rights reserved.