2017-01-25 6 views
0

私は異なるカスタムクラスにしようとしていますが、コードは95%同じです。可能な方法があれば、実際に組み合わせて簡単に呼び出せるようにしたいと思っています。類似のクラスを一緒に組み合わせたり、それらを関数にするにはどうすればいいですか?

はのは、このための簡単かつ可能な方法があります私は2つの異なるカスタム権限

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 

があるとしましょうか?

+0

要望はありますか?あなたはそれがどんなユーザーであるかを調べようとしていますか?これらのクラスの使用状況をコンテキストで表示できますか? – depperm

+0

どのような意味でそれらを組み合わせますか?あなたの目標は何ですか? – martineau

答えて

1

実際にあなたがしようとしていることをよりよく理解することなく、コードの重複を排除するためにコードをリファクタリングする可能性があります。

それはIsUser1IsUser2ためhas_permissionの実装の間の唯一の変化は、彼らがアクセスしよう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) 
+0

'class BasePermission(object):'という行は、新しいスタイルクラスを強制するための古いPython 2コードと関連があることに言及することはおそらく価値があります。 Python 3では 'class BasePermission:'で十分です。 – cdarke

+0

@cdarkeそれは本当です。それが不必要な場合でも、私はそれがより良いスタイルだと思う。 "明示的なものは暗黙的なものよりも良い" - PythonのZen。 – Tagc

+0

@Tagc thx!これは素晴らしかったですが、私はちょっと混乱していますが、この部分はどのように機能しますか? 'self.user_selector(request)'それは '(lambda request:request.user.user2)'にどのように渡されますか – Dora

関連する問題