自定义的__str__和__repr__不起作用。

3
我可以帮助您进行翻译。以下是关于it技术的内容:

我正在尝试转换以下输出:

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'

1
在某个地方,你使用了 self.hop 而不是 self.hops。另一个问题是你试图使用 %d 来打印一个看起来像列表的东西,但这会失败。 - TheSoundDefense
2
你需要在TorHop类中添加__str____repr__的定义,而不是在TorCircuit类中。 - Mark Dickinson
1个回答

5
您似乎认为在TorCircuit.decrypt()类中使用str(hop)等同于self.__str__(hop), 但事实并非如此。实际上,它相当于hop.__str__()
换句话说,不要将这些方法放在TorCircuit类上,而应该放在TorHop类上。
当您将它们添加到TorHop时,请注意__str____repr__不接受参数。请删除hop参数;selfTorHop实例。
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

也许。
接下来,您似乎期望跳数被编号。实际上并没有编号。您可以修改循环,在打印TorHop对象的值之前添加一个数字,使用enumerate()函数
for i, hop in enumerate(self.hops):
    print "decrypt: hop #{} {}".format(i, hop)

此代码将输出 decrypt: hop #0,然后是 decrypt: hop #1 等等,最后是 hop.__str__() 的结果。


1
@user3842234:你的TorHop类在哪里? - Martijn Pieters
@user3842234:那是因为你的TorHop没有hophops属性 - Martijn Pieters
是的,self.hops = [] 在 TorCircuit 中。如果有意义的话,是否有办法从中获取数据并在 torHop 中使用? - user3842234
@user3842234:__str__ 只能使用 TorHop 对象本身的属性。要么给这些对象分配跳数,要么像示例中那样在循环中添加数字。 - Martijn Pieters
非常感谢您的帮助,只有一个最后的问题,枚举应该放在哪里?因为我仍然无法打印出任何东西。 - user3842234
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接