質問

スロットの小さな助けが必要です。

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)
.

これらの文字列タイプとエンコーディング辞書と混同しないでください。それらは定数です。 問題は、私が期待どおりに機能しないということです。

>>> 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)
.

何が悪いの?私は本当に私のクラスを不変のままにしたいので、スロットを削除する解決策は本当にあまり良くないものではありません。:-)たくさんありがとう!

役に立ちましたか?

解決

__init__ではなく__new__を使用します。

__new__は、最初の引数(self)が class オブジェクトであり、新しく作成されたオブジェクトではなく、クラスメソッドです。新しいオブジェクトを返す必要があります。あなたは通常それを再定義したくないが、あなたが既存のオブジェクトを返すようなものをやりたいのであれば、あなたは既存のオブジェクトを返すことができます。

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

これを修正するには、メソッド名を__init__に変更して、最後の行(return(self))を削除します。__init__。常にNoneを返す必要があります。他に何かを返すと、TypeErrorが発生します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top