首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我不能在这里使用@staticmethod?

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

Stack Overflow用户
提问于 2020-03-05 01:39:41
回答 1查看 44关注 0票数 2

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

代码语言:javascript
复制
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):
    ...

而且它起作用了。代码的可读性会因为在它所属的类之外使用这个小的实用函数而受到影响,所以我尝试了

代码语言:javascript
复制
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现在做了什么,它的行为就像一个总是返回True的无操作函数,即使它所做的只是return False

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

EN

回答 1

Stack Overflow用户

发布于 2020-03-10 17:24:02

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

代码语言:javascript
复制
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):

@transition中,ok_to_check_me的使用发生在创建类的代码执行期间,而不是在其实例化期间。所以它需要一个对上面定义的实际函数的引用。将@staticmethod应用于该函数会将其替换为其他东西,而无论是什么东西,转换装饰器都不能接受。

当类被实例化时,函数被绑定到实例。但是,这不会影响对@transition已经存储在其内部的函数的引用。在这种情况下,绑定是无害的,因为instanceself通常指的是同一个。在其他情况下,您可能希望在实例的__init__方法中删除非预期的绑定函数(或者只是大量的文档,以便不尝试将其用作对象方法)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60531768

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档