任意の型/クラスをファクトリメソッドに置き換えても、クラスオブジェクトのほとんどの機能を保持できるプロキシクラスを考案しました。これがどのように機能するかのサンプルです:
class ProxyClass:
def __init__(self, cls):
self._ProxyClass_cls = cls
def __getattr__(self, name):
return getattr(self._ProxyClass_cls, name)
class _strProxy(ProxyClass):
def __call__(self, s):
if '\n' in s:
raise ValueError
if s not in self._cache:
self._cache[s] = self._ProxyClass_cls(s)
return self._cache[s]
str = _strProxy(str)
str._cache = {}
>>> s = str('hello')
>>> s
'hello'
>>> type(s)
<type 'str'>
>>> str('hello\n')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 4, in __call__
ValueError
このファクトリメソッドの実装は、元のクラスオブジェクトを完全に置き換え、次のようなものを許可するため、気に入っています。
>>> map(str.split, [str('foo bar'), str('bar foo')])
[['foo', 'bar'], ['bar', 'foo']]
私が見つけた唯一の問題は、次のようなクラス自体の操作に関するものrepr()
です。
>>> repr(str)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: descriptor '__repr__' of 'str' object needs an argument
この例では、はではなくrepr()
呼び出しを試みています。変更を修正しようとしましたが、この場合、これは不可能であることがわかりました。str.__repr__()
type.__repr__(str)
str.__class__
>>> str.__class__ = type
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: __class__ must be set to a class
誰かがrepr(str)
私がしていることを達成するための機能を復元する方法、またはおそらく別の方法を知っていますか?