我正在尝试转换输出,例如:
decrypt : <torfuncs.TorHop instance at 0x7f44babb8440>
进入更具可读性的东西,结果应该是数组中的字符串。我已经定义了__str__
和__repr__
,但即便如此,我仍然会得到上面的结果。我做错了什么?
class TorCircuit():
def __init__(self, sock, circid):
self.hops = []
self.circId = circid
self.socket = sock
self.tempX = 0
self.packetSendCount = 0
self.cookie = []
def __str__(self, hop):
return 'hop #%d' % self.hops
def __repr__(self, hop):
return 'hop #%d' % self.hops
def decrypt(self, relayCell):
for hop in self.hops:
print "decrypt :", str(hop)
relayCell = hop.decrypt(relayCell)
if relayCell[1]==0 and relayCell[2]==0:
return relayCell
return relayCell
我想要打印的是当前用于解密的跳
编辑TorHop
class TorHop:
def __str__(self):
return 'hop #' % self.hop
def __repr__(self):
return 'hop #' % self.hop
def __init__(self, KH, Df, Db, Kf, Kb):
self.KH = KH
self.Df = Df
self.Db = Db
self.Kf = Kf
self.Kb = Kb
self.fwdSha = SHA.new()
self.fwdSha.update(Df)
self.bwdSha = SHA.new()
self.bwdSha.update(Db)
ctr = Counter.new(128,initial_value=0)
self.fwdCipher = AES.new(Kf, AES.MODE_CTR, counter=ctr)
ctr = Counter.new(128,initial_value=0)
self.bwdCipher = AES.new(Kb, AES.MODE_CTR, counter=ctr)
def encrypt(self, data):
return self.fwdCipher.encrypt(data)
def decrypt(self, data):
return self.bwdCipher.decrypt(data)
我现在得到:
AttributeError: TorHop instance has no attribute 'hops'
答案 0 :(得分:4)
您似乎认为在str(hop)
类中使用TorCircuit.decrypt()
会转换为self.__str__(hop)
。 情况并非如此。它转换为hop.__str__()
。
换句话说,不要将这些方法放在TorCircuit
类上,而是将它们放在TorHop
类上。
当您将其添加到TorHop
时,请考虑__str__
和__repr__
不接受参数。删除hop
参数; self
是TorHop
个实例:
def __str__(self):
return 'hop #%d' % self.hop
def __repr__(self):
return 'hop #%d' % self.hop
我会将__repr__
保留为对调试更有用的东西:
def __repr__(self):
return '<TorHop(%d)>' % self.hop
也许
接下来,您似乎希望对跃点进行编号。他们不是。您可以使用enumerate()
function 3>更改循环,以便在为TorHop
对象打印的值之前添加一个数字
for i, hop in enumerate(self.hops):
print "decrypt: hop #{} {}".format(i, hop)
这会打印decrypt: hop #0
,然后是decrypt: hop #1
等,然后是hop.__str__()
的结果。