簡體   English   中英

__slots__和未綁定的方法

[英]__slots__ and unbound methods

我在插槽方面需要一點幫助。

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)

怎么了? 我真的很想讓我的班級保持不變,因此刪除插槽的解決方案確實不是很好。 :-) 非常感謝!

您要使用__init__而不是__new__

__new__是一個類方法,其第一個參數(自身)是對象,而不是新創建的對象。 它必須返回新對象。 通常,您不想重新定義它,但是如果您想執行諸如返回現有對象之類的操作,則可以。

__init__是常規實例方法,第一個參數(自身)是新創建的實例。 它的工作方式類似於其他語言的構造函數。

要解決此問題,請將方法名稱更改為__init__並刪除最后一行( return(self) )。 __init__ 必須總是返回None ; 返回任何其他內容都會導致TypeError

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM