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

2024-03-28 22:15:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图自定义不同的权限类,但我认为,代码是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

有什么简单可行的方法吗?你知道吗


Tags: 方法selfviewfalse权限returnifrequest
1条回答
网友
1楼 · 发布于 2024-03-28 22:15:03

如果没有更好地理解您要做的事情,这似乎是一种可能的方法,您可以重构代码以消除代码重复。你知道吗

它工作的基础是has_permissionfor IsUser1IsUser2的实现之间唯一的变化是它们尝试访问的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)

相关问题 更多 >