1

任意の型/クラスをファクトリメソッドに置き換えても、クラスオブジェクトのほとんどの機能を保持できるプロキシクラスを考案しました。これがどのように機能するかのサンプルです:

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)私がしていることを達成するための機能を復元する方法、またはおそらく別の方法を知っていますか?

4

2 に答える 2

0

しない理由

>>> class _strPproxy(ProxyClass):
...     def __call__(self, s):
...         self.s = s
...         if '\n' in s:
...             raise ValueError
...         if s not in self._cache:
...             self._cache[s] = self._ProxyClass_cls(s)
...         return self._cache[s]
...     def __repr__(self): 
...         return repr(self.s)
于 2012-05-24T21:35:04.950 に答える
0

すべてのクラスが から継承されていることを確認してくださいobject:

class ProxyClass(object):

Python 3.x では、objectとにかくすべてのクラスが から継承されるため、これを行う必要はありません。しかし、Python 2.x では、関連するすべてのクラスが から継承する「新しいスタイルのクラス」でない限り、継承は正しく機能しませんobject

repr(str)上記の変更を行った後、私にとってはうまくいきます。

于 2012-05-24T21:35:11.983 に答える