2013-02-02 33 views
1

我想这是最好的代码和注释说明:通过扩展创建缓冲区类的Python海峡

import struct 

class binary_buffer(str): 
    def __init__(self, msg=""): 
     self = msg 
    def write_ubyte(self, ubyte): 
     self += struct.pack("=B", ubyte) 
     return len(self) 

Output 
>> bb = binary_buffer() 
>> bb # Buffer starts out empty, as it should 
'' 
>> bb.write_ubyte(200) 
1 # We can see that we've successfully written one byte to the buffer 
>> bb 
'' # Huh? We just wrote something, but where has it gone? 

回答

4

str s为不可变的。因此,

self += struct.pack("=B", ubyte) 

被评估为

self = self + struct.pack("=B", ubyte) 

此赋新值的名称自我,而是自我,就像任何其他的名称。一旦方法退出,名称(和关联的对象)就会被忘记。

你想要一个bytearray

>>> bb = bytearray() 
>>> bb.append(200) 
>>> bb 
bytearray(b'\xc8') 
+0

我会说,在一般情况下,分配给“自我”是错误的。至少我不能拿出这个合法的用途。 –

+0

@doomster:为什么呢?你会怎么做呢? – Peter

+0

@TahitiPetey因为你只是将自己绑定到名字self,这通常是你当前的对象。要更改当前对象,请分配给* its *属性之一,或等效地调用其中一个方法。 – phihag

相关问题