如何从wrap定义实例方法

时间:2012-08-19 04:08:10

标签: python django

我正在开发一个django网站,想要定义一些像下面这样的实例方法。

Class Auth(models.Model):
    def wrap_has_perm(self, perm):
        def wrap():
            if self.is_staff and self.has_perm(perm):
                return True
            else:
                return False
    can_add_order = wrap_has_perm('finance.normal')

    can_review_order = wrap_has_perm('finance.review')

    is_leader = wrap_has_perm('finance.leader')

    is_finance = wrap_has_perm('finance.finance')

我想将can_add_ordercan_review_orderis_leaderis_finance用作django管理站点的list_display元素。但是现在这些实例方法是非法的。(TypeError:wrap_has_perm()只需要2个参数(给定1个))

我如何实现这些方法?

如果我使用partial:

def staff_has_perm(self, perm):
        return self.is_staff and self.has_perm(perm)

    can_add_order = partial(staff_has_perm, perm='finance.normal')
    can_review_order = partial(staff_has_perm, perm='finance.review')
    is_leader = partial(staff_has_perm, perm='finance.leader')
    is_finance = partial(staff_has_perm, perm='finance.finance')

它引发( * TypeError:staff_has_perm()只需要2个参数(给定1个)); 我应该通过self以及如何通过吗?

1 个答案:

答案 0 :(得分:1)

self移至wrap()的定义:

def wrap_has_perm(perm):
    def wrap(self):

然而,更多Pythonic方法可能是使用functools.partial

from functools import partial

class Auth(models.Model):
    def has_perm(self, perm):
        # ...

    can_add_order = partial(has_perm, perm='finance.normal')

    can_review_order = partial(has_perm, perm='finance.review')

    is_leader = partial(has_perm, perm='finance.leader')

    is_finance = partial(has_perm, perm='finance.finance')