spam
をいくつかのクラスSpam
のインスタンスとし、spam.ham
が組み込みタイプのオブジェクト、たとえばdict
とします。 Spam
はdict
のサブクラスではありませんが、そのインスタンスには同じAPIを標準のdict
(つまり同じシグネチャを持つ同じメソッド)としたいと思いますが、フォームのbazillion定型句のメソッドを入力しないようにしたいと考えています:Pythonで__special_methods__の委任を自動化するには?
def apimethod(self, this, that):
return self.ham.apimethod(this, that)
私は次のことを試してみました:
class Spam(object):
def __init__(self):
self.ham = dict()
def __getattr__(self, attr):
return getattr(self.ham, attr)
...しかし、それは__setitem__
よう特別なメソッド、について "通常の" keys
とitems
のような方法、ではなくのために働く、__getitem__
、および__len__
:
>>> spam = Spam()
>>> spam.keys()
[]
>>> spam['eggs'] = 42
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'Spam' object does not support item assignment
>>> spam.ham['eggs'] = 42
>>> foo.items()
[('eggs', 42)]
>>> spam['eggs']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'Spam' object is not subscritable
>>> len(spam)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'Spam' object has no len()
私が試した全ての特別な方法は、同様のエラーを生成しました。
(それらはデリゲートと呼ばれますように)どのように私は特別な方法の定義を自動化することができますか?
明確化:標準的なメソッド検索シーケンスを活用するソリューションを必ずしも探しているわけではありません。私の目標は、定型コードを最小限に抑えることです。
ありがとうございます!
私はあなたには正当な理由があると確信していますが、 'Spam'を' dict'のサブクラスにしたくない理由を説明できますか? – zwol
Urgh。 Second Zack:もしあなたが 'dict'のように見えたいなら' dict'から継承します。 – katrielalex