私は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 を制御できません。これはライブラリの一部であり、変更できません。