0

スロットについて少し助けが必要です。

class bstream(object):
  __slots__ = ['stream']
  stream = string()

  def __new__(self, stream, encoding=None):
    if encoding == None:
      encoding = ENCODING['default']
    if isinstance(stream, bytes):
      self.stream = stream.decode(encoding)
    elif isinstance(stream, string):
      self.stream = stream
    else: # if unknown type
      strtype = type(stream).__name__
      raise(TypeError('stream must be bytes or string, not %s' % strtype))
    return(self)

  def __repr__(self):
    '''bstream.__repr__() <==> repr(bstream)'''
    chars = ['\\x%s' % ('%02x' % ord(char)).upper() for char in self.stream]
    result = ''.join(chars)
    return(result)

  def func(self):
    return(1)

これらの文字列タイプとENCODINGSディクショナリと混同しないでください。これらは定数です。問題は、次のコマンドが期待どおりに機能しないことです。

>>> var = bstream('data')
>>> repr(var)
<class '__main__.bstream'> # Instead of '\\x64\\x61\\x74\\x61'
>>> var.func()
TypeError: unbound method func() must be called with bstream instance as first argument (got nothing instead)

どうしたの?クラスを不変のままにしておきたいので、スロットを削除するソリューションは実際にはあまり良いものではありません。:-) どうもありがとう!

4

1 に答える 1

4

__init__ではなく、を使用したい__new__

__new__は、最初の引数(self)がクラスオブジェクトであり、新しく作成されたオブジェクトではないクラスメソッドです。新しいオブジェクトを返す必要があります。通常は再定義する必要はありませんが、既存のオブジェクトを返すなどの操作を行う場合は再定義できます。

__init__は通常のインスタンスメソッドであり、最初の引数(self)は新しく作成されたインスタンスです。他の言語のコンストラクターのように機能します。

これを修正するには、メソッド名をに変更し__init__、最後の行(return(self))を削除します。__init__。常に返す必要がありNoneます; それ以外のものを返すと、になりTypeErrorます。

于 2012-07-27T20:33:24.377 に答える