自定义__str__和__repr__不起作用

时间:2014-07-15 18:48:37

标签: python

我正在尝试转换输出,例如:

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 个答案:

答案 0 :(得分:4)

您似乎认为在str(hop)类中使用TorCircuit.decrypt()会转换为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

也许

接下来,您似乎希望对跃点进行编号。他们不是。您可以使用enumerate() function 更改循环,以便在为TorHop对象打印的值之前添加一个数字

for i, hop in enumerate(self.hops):
    print "decrypt: hop #{} {}".format(i, hop)

这会打印decrypt: hop #0,然后是decrypt: hop #1等,然后是hop.__str__()的结果。