如何将类似的类组合在一起或将它们组合成一个函数?

时间:2017-01-25 19:35:07

标签: python class permissions

我正在尝试自定义不同的权限类,但我认为,代码是95%相同。如果有可能的方法,我真的想做到这一点,以便他们可以轻松组合和调用。

假设我有两种不同的自定义权限

class IsUser1(BasePermission):
    def has_permission(self, request, view):
        if not request.user.is_anonymous:
            try:
                request.user.user1
                return True
            except Exception:
                return False
        return False

    def has_object_permission(self, request, view, obj):
        pass


class IsUser2(BasePermission):
    def has_permission(self, request, view):
        if not request.user.is_anonymous:
            try:
                request.user.user2
                return True
            except Exception:
                return False
        return False

    def has_object_permission(self, request, view, obj):
        pass

这有简单易行的方法吗?

1 个答案:

答案 0 :(得分:1)

如果没有真正了解您正在尝试做什么,这似乎是您重构代码以消除代码重复的可能方式。

它的工作原理是has_permission IsUser1IsUser2的{​​{1}}实现之间的唯一差异是他们尝试访问的user属性,所以我定义了一个每个类的公共超类型,它接受来自每个类的回调,确定它在收到的请求时尝试访问哪个属性。

from abc import abstractmethod


class BasePermission(object):
    @abstractmethod
    def has_permission(self, request, view):
        pass


class BaseUserPermission(BasePermission):
    def __init__(self, user_selector):
        self.user_selector = user_selector

    def has_permission(self, request, view):
        if not request.user.is_anonymous:
            try:
                self.user_selector(request)
                return True
            except Exception:
                return False
        return False

    def has_object_permission(self, request, view, obj):
        pass


class IsUser1(BaseUserPermission):
    def __init__(self):
        super().__init__(lambda request: request.user.user1)


class IsUser2(BaseUserPermission):
    def __init__(self):
        super().__init__(lambda request: request.user.user2)