我需要一些广告位的小帮助。
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)
怎么了?我真的想让我的课程一成不变,所以删除插槽的解决方案真的不是很好。 :-)非常感谢!
答案 0 :(得分:4)
您想使用__init__
,而不是__new__
。
__new__
是一个类方法,第一个参数(self)是 class 对象,而不是新创建的对象。它必须返回新对象。您通常不想重新定义它,但如果您想要执行返回现有对象的操作,则可以。
__init__
是一个常规实例方法,第一个参数(self)是新创建的实例。它的工作方式与其他语言的构造函数类似。
要解决此问题,请将方法名称更改为__init__
并删除最后一行(return(self)
)。 __init__
。必须始终返回None
;返回任何其他内容会产生TypeError
。