首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >__slots__与无界方法

__slots__与无界方法
EN

Stack Overflow用户
提问于 2012-07-27 20:30:57
回答 1查看 137关注 0票数 0

我需要一些关于插槽的帮助。

代码语言:javascript
复制
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)

不要与那些字符串类型和编码字典混淆:它们是常量。问题是,以下命令不能像我预期的那样工作:

代码语言:javascript
复制
>>> 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)

怎么了?我真的很想让我的类保持不变,所以去除插槽的解决方案真的不是很好。-)非常感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-07-27 20:33:24

您想要使用__init__,而不是__new__

__new__是一个类方法,其第一个参数(self)是类对象,而不是新创建的对象。它必须返回新对象。您通常不想重新定义它,但是如果您想要返回一个现有的对象,您可以这样做。

__init__是一个常规实例方法,第一个参数(self)是新创建的实例。它的工作方式类似于其他语言中的构造函数。

要解决这个问题,请将方法名更改为__init__并删除最后一行(return(self))。__init__。必须始终返回None;返回任何其他内容都会导致TypeError

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11695243

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档