ご存知のように、Python は文字列の書式設定をサポートしていますが、Python 2 でそれがどのように実現されたかについてお話したいと思いa=u'абв'; b='abc'; c='%s%s'
ますc
。myobject
変数c
に型がある独自のクラスを持つことは可能myobject
ですか? つまり、この演算子をオーバーロードできますか? 答えは Python 3 と Python 2 で機能するはずですが、Python 2 で必要なものを説明するのはより簡単でした。ありがとう!
class ustream(object):
'''ustream class provides an easy access for basic operations with Unicode
streams. The main advantage of this class is that it already has built-in
support for regular expressions and transliteration.'''
__slots__ = ['_stream_', 'array', 'stream']
def __init__(self, stream='', encoding=ENCODING['default']):
'''ustream.__init__([stream[, encoding]]) -> ustream'''
if isinstance(encoding, bstream):
encoding = encoding.stream
elif isinstance(encoding, ustream):
encoding = encoding.stream
if isinstance(stream, bytes):
stream = stream.decode(encoding)
elif isinstance(stream, string):
stream = string(stream)
elif isinstance(stream, bstream):
stream = stream.stream.decode(encoding)
elif isinstance(stream, ustream):
stream = stream.stream
else: # if unknown type
typename = type(stream).__name__
raise(TypeError('stream must be bytes or string, not %s' % typename))
self._stream_ = stream
@property
def array(self):
'''unicode stream as array'''
return([ord(char) for char in self.stream])
@property
def stream(self):
'''unicode stream as string'''
return(self._stream_)
def __mod__(self, stream):
'''ustream.__mod__(stream) <==> ustream % stream'''
result = self.stream % ustream(stream).stream
result = ustream(result)
return(result)
def __rmod__(self, stream):
'''ustream.__rmod__(stream) <==> stream % ustream'''
stream = ustream(stream)
stream = stream.stream
result = stream % self.stream
result = ustream(result)
return(result)
これは私のラップトップからのコード サンプルです。string
== str
Python 3 およびunicode
Python 2 の場合。後方互換性のみ。
これが私が手に入れたいものです。
>>> src = ustream('a stream')
>>> add = 'Hello man'
>>> result = '%s! Look here: we have %s!' % (add, src)
>>> type(result)
utstream
>>> print(result)
Hello man! Look here: we have a stream!