为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

守候你守候我 2021-10-10 14:35:17
我有一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都不应逃避验证,因为如果缺少某些内容,最终报告生成将失败。我怎样才能做到这一点?
查看完整描述

3 回答

?
慕婉清6462132

TA贡献1804条经验 获得超2个赞

我可以考虑两种方法来解决这个问题。在不了解更多实现细节的情况下,我不能说更多:


装饰你的方法:每个返回实例都通过装饰器函数运行。您可能希望将其作为独立函数或类的一部分,具体取决于您的特定用例。


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_validate

class ReportEntry(object):

    ...


查看完整回答
反对 回复 2021-10-10
?
繁花如伊

TA贡献2012条经验 获得超12个赞

一种方法,我能想到的是定义__enter__并__exit__在那里方法validate在被称为__exit__中ReportEntry


class 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 as

with ReportEntry() as report:

    ...

但同样,这只会在使用时强制执行 with ReportEntry() as report:


查看完整回答
反对 回复 2021-10-10
  • 3 回答
  • 0 关注
  • 223 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号