为什么我不能在这里使用@staticmethod?

时间:2020-03-04 17:39:40

标签: python django django-fsm

我正在使用django-fsm来实现状态机。代码看起来像

def user_ok_to_check_me( instance, user):
    ... 

class Job( models.Model):

# ... many screenfulls of code

    @transition( field=state,  target=BOOKING, source=CHECKING, permission=user_ok_to_check_me)
    def fail_checking(self, **kwargs):
    ...

,它正在工作。由于代码所属类之外的实用工具很少,因此代码的可读性受到了损害,所以我尝试了

class Job( models.Model):

    # ... many screenfulls of code

    @staticmethod
    def user_ok_to_check_me( instance, user):
        ... 
    @transition( field=state,  target=BOOKING, source=CHECKING, permission=user_ok_to_check_me)
    def fail_checking(self, **kwargs):

这不起作用。不确定user_ok_to_check_me现在做什么,它的行为就像一个无操作函数,即使它所做的只是return False

,它总是返回True

为什么?有没有办法在类中声明这个小功能? (使用lambda instance, user:有点太长了)

1 个答案:

答案 0 :(得分:0)

找到了答案,尽管我不确定我是否理解。

class Job( models.Model):

    # ... many screenfulls of code

    # @staticmethod  #NO DECORATOR
    def user_ok_to_check_me( instance, user):
    ... 
    @transition( field=state,  target=BOOKING, source=CHECKING, permission=user_ok_to_check_me)
    def fail_checking(self, **kwargs):

ok_to_check_me@transition的使用发生在创建该类的代码的执行期间,而不是在其实例化期间。因此,它需要参考上面定义的实际功能。将@staticmethod应用于该函数将其替换为其他任何东西,无论是什么,过渡修饰符都不可接受。

实例化该类时,该函数将绑定到实例。但是,这不会影响对@transition已存储在其内部的函数的引用。在这种情况下,绑定是无害的,因为instanceself通常是指相同的绑定。在其他情况下,您可能想通过其__init__方法从实例中删除意外绑定函数(或者只是大量文档,不要尝试将其用作对象方法)。

相关问题