Вопрос

Мне нужна небольшая помощь с игровые автоматы.

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) является класс объект, а не вновь созданный объект.Он должен вернуть новый объект.Обычно вы не хотите переопределять его, но вы можете, если хотите делать что-то вроде возврата существующего объекта.

__init__ является обычным методом экземпляра, а первый аргумент (self) - это вновь созданный экземпляр.Это работает подобно конструкторам в других языках.

Чтобы исправить это, измените имя метода на __init__ и удалите последнюю строку (return(self)). __init__.всегда должен возвращаться None;возврат чего-либо еще приводит к TypeError.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top