1

私はPythonでプロキシパターンに取り組んでいます。メソッドを使用して、通常のメソッドを適切にプロキシしました__getattr__。ただし、classmethod は失敗します。

    class DBClass(object):
      def aMethod(self):
        print 'aMethod'
      @classmethod
      def aClassMethod(cls):
        print 'aClassMethod'

    class DBWrapper(object):
      def __init__(self, db = None):
        super(DBWrapper, self).__init__()
        self._db = db

      def __getattr__(self, name):
        if not self._db:
          raise Exception("DBWrapper: DB is not initialized yet!")    
        if hasattr(self._db, name):
          return getattr(self._db, name)
        else:
          raise AttributeError(name)

    class User(DBWrapper):
      def uMethod(self):
        print 'uMethod'

      @classmethod
      def userClassMethod(cls):
        cls.aClassMethod()

    db = DBClass()
    user = User(db)
    user.uMethod() #prints uMethod
    user.aMethod() #prints aMethod
    user.aClassMethod() #prints aClassMethod
    user.userClassMethod() #Fails with AttributeError: type object 'User' has no attribute 'aClassMethod'

「User」のインスタンスには DBClass に関する情報があるのに対し、「User」クラス定義には DBClass に関する情報がないため、これが失敗することを理解しています。ここで達成しようとしていることを解決するにはどうすればよいですか?

追記: 簡単にするために、継承の他の側面を削除しました。実際の実装では:

  • DBClass から継承する複数のクラスがあります

  • DBWrapper から継承する複数のクラスがあります

  • DBClass-Child のインスタンスは、DBWrapper-Child のコンストラクターに渡されるものです。これは、User クラスのインスタンス化と同様です。

  • DBClass を制御できません。これはライブラリの一部であり、変更できません。

4

0 に答える 0