python - 如何在返回时始终强制调用类方法

我有一ReportEntry堂课


class ReportEntry(object):

  def __init__(self):

      # Many attributes defined here


  ... # Lot many setattr/getattr here

  def validate(self):

      # Lot of validation code in here

      return self

多个其他类保持has-a与ReportEntry类的关系


class A(object):

  def test1(self):

    t1 = ReportEntry()

    # Assign the attribute values to t1

    return t1.validate()


  def test2(self):

    t2 = ReportEntry()

    # Assign the attribute values to t2

    return t2.validate()

并且有多个这样的类,如 A.


我需要强制执行的每个ReportEntry类实例调用validate()上return或许只是之前return。


基本上,任何实例ReportEntry都不应逃避验证,因为如果缺少某些内容,最终报告生成将失败。


我怎样才能做到这一点?


守候你守候我
浏览 224回答 3
3回答

慕婉清6462132

我可以考虑两种方法来解决这个问题。在不了解更多实现细节的情况下,我不能说更多:装饰你的方法:每个返回实例都通过装饰器函数运行。您可能希望将其作为独立函数或类的一部分,具体取决于您的特定用例。def validate(func):    return func().validate()class A(object):    @validate    def test1(self):        t1 = ReportEntry()        # Assign the attribute values to t1        return t1    @validate    def test2(self):        t2 = ReportEntry()        # Assign the attribute values to t2        return t2更新 __setattr__ 并装饰你的类:def always_validate(cls):    # save the old set attribute method    old_setattr = getattr(cls, '__setattr__', None)    def __setattr__(self, name, value):        # set the attribute        validate(name, value)        old_setattr(self, name, value)    cls.__setattr__ = __setattr__    return cls然后你可以装饰你的 ReportEntry:@alway_validateclass ReportEntry(object):    ...

繁花如伊

一种方法,我能想到的是定义__enter__并__exit__在那里方法validate在被称为__exit__中ReportEntryclass ReportEntry(object):  def __enter__(self):    return self  def __init__(self):  # Many attributes defined here  ... # Lot many setattr/getattr here  def validate(self):    # Lot of validation code in here    return self  def __exit__(self, a,b,c):    self.validate()    return True# And then use it aswith ReportEntry() as report:    ...但同样,这只会在使用时强制执行 with ReportEntry() as report:
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python