__слоты__ и несвязанные методы
-
12-12-2019 - |
Вопрос
Мне нужна небольшая помощь с игровые автоматы.
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
.